From 10d259e8add96d3e686baf6ed2b0145ff1fbdc46 Mon Sep 17 00:00:00 2001 From: Ian Epperson Date: Thu, 14 Sep 2017 21:11:05 -0700 Subject: [PATCH 01/33] Adds ability to specify a fallthrough --- switchlang.py | 53 +++++++++++++++++++++++++++++----------------- tests/coretests.py | 39 ++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/switchlang.py b/switchlang.py index 39568a2..bff0f47 100644 --- a/switchlang.py +++ b/switchlang.py @@ -1,29 +1,38 @@ # Here is a first pass implementation at adding switch import uuid -from typing import Callable, Any, List +from typing import Callable, Any class switch: __no_result = uuid.uuid4() + __default = uuid.uuid4() def __init__(self, value): self.value = value - self.cases = {} + self.cases = set() + self._found = False self.__result = switch.__no_result + self._falling_through = False + self._func_stack = [] def default(self, func: Callable[[], Any]): - self.case('__default__', func) + self.case(switch.__default, func) - def case(self, key, func: Callable[[], Any]): - if isinstance(key, range): - for n in key: - self.case(n, func) - return + def case(self, key, func: Callable[[], Any], fallthrough=False): + if fallthrough is not None: + if self._falling_through: + self._func_stack.append(func) + if not fallthrough: + self._falling_through = False - if isinstance(key, list): + if isinstance(key, list) or isinstance(key, range): + found = False for i in key: - self.case(i, func) - return + if self.case(i, func, fallthrough=None): + found = True + if fallthrough is not None: + self._falling_through = fallthrough + return found if key in self.cases: raise ValueError("Duplicate case: {}".format(key)) @@ -32,7 +41,13 @@ def case(self, key, func: Callable[[], Any]): if not callable(func): raise ValueError("Func must be callable.") - self.cases[key] = func + self.cases.add(key) + if key == self.value or not self._found and key == self.__default: + self._func_stack.append(func) + self._found = True + if fallthrough is not None: + self._falling_through = fallthrough + return True def __enter__(self): return self @@ -41,21 +56,19 @@ def __exit__(self, exc_type, exc_val, exc_tb): if exc_val: raise exc_val - func = self.cases.get(self.value) - if not func: - func = self.cases.get('__default__') - - if not func: + if not self._func_stack: raise Exception("Value does not match any case and there " "is no default case: value {}".format(self.value)) - # noinspection PyCallingNonCallable - self.__result = func() + for func in self._func_stack: + # noinspection PyCallingNonCallable + self.__result = func() @property def result(self): if self.__result == switch.__no_result: - raise Exception("No result has been computed (did you access switch.result inside the with block?)") + raise Exception("No result has been computed (did you access " + "switch.result inside the with block?)") return self.__result diff --git a/tests/coretests.py b/tests/coretests.py index 679acd2..873cce5 100644 --- a/tests/coretests.py +++ b/tests/coretests.py @@ -129,3 +129,42 @@ def test_closed_range(self): s.default(lambda: 'default') self.assertEqual(s.result, "6") + + def test_fallthrough_simple(self): + visited = [] + value = 2 + with switch(value) as s: + s.case(1, lambda: visited.append(1) or 1) + s.case(2, lambda: visited.append(2) or 2, fallthrough=True) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, "default") + self.assertEqual(visited, [2, 'default']) + + def test_fallthrough_list(self): + visited = [] + value = 5 + with switch(value) as s: + s.case([1, 2, 3], lambda: visited.append(1) or 1) + s.case([4, 5, 6], lambda: visited.append(4) or 4, fallthrough=True) + s.case([7, 8, 9], lambda: visited.append(7) or 7, fallthrough=True) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, "default") + self.assertEqual(visited, [4, 7, 'default']) + + def test_fallthrough_some_list(self): + visited = [] + value = 5 + with switch(value) as s: + s.case([1, 2, 3], lambda: visited.append(1) or 1) + s.case([4, 5, 6], lambda: visited.append(4) or 4, fallthrough=True) + s.case([7, 8, 9], lambda: visited.append(7) or 7) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, 7) + self.assertEqual(visited, [4, 7]) + + +if __name__ == '__main__': + unittest.main() From 77850d9834806ec98066809adfc352a5c582e259 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 21 Sep 2017 09:01:03 -0700 Subject: [PATCH 02/33] Another comparison in the readme (if/elif/else vs switch). --- README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/README.md b/README.md index c74f30f..98075e7 100644 --- a/README.md +++ b/README.md @@ -139,3 +139,64 @@ while True: Personally, I much prefer to read and write the one above. That's why I wrote this module. It seems to convey the intent of switch way more than the dict. But either are options. + +## Why not just `if / elif / else`? + +The another push back on this idea is that we already have this problem solved. +Switch statements are really if / elif / else blocks. So you write the following code. + +```python +# with if / elif / else + +while True: + action = get_action(action) + result = None + + if action == 'c' or action == 'a': + result = create_account() + elif action == 'l': + result = log_into_account() + elif action == 'r': + result = register_cage() + elif action == 'u': + result = update_availability() + elif action == 'v': + result = view_bookings() + elif action == 'b': + result = view_bookings() + elif action == 'x': + result = exit_app() + elif action in {1, 2, 3, 4, 5}: + result = set_level(action) + else: + unknown_command() +``` + +I actually believe this is a little better than the +[raw dict option](https://github.com/mikeckennedy/python-switch#why-not-just-raw-dict). +But there are still things that are harder. + +* How would you deal with fall-through cleanly? +* Did you notice the bug? We forgot to set result in default case (`else`)? +* While it's pretty clear, it's much more verbose and less declarative than the switch version. + +Again, compare the if / elif / else to what you have with switch. This code is identical except +doesn't have the default case bug. + +```python +while True: + action = get_action(action) + + with switch(action) as s: + s.case(['c', 'a'], create_account) + s.case('l', log_into_account) + s.case('r', register_cage) + s.case('u', update_availability) + s.case(['v', 'b'], view_bookings) + s.case('x', exit_app) + s.case('', lambda: None) + s.case(range(1,6), lambda: set_level(action)) + s.default(unknown_command) + + result = s.result +``` \ No newline at end of file From 5a2801eb71600a0dad9d1b1d1b026ae1bcd50d83 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 21 Sep 2017 09:03:50 -0700 Subject: [PATCH 03/33] Do something in the result for each example. --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 98075e7..22258f1 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ while True: s.case(range(1,6), lambda: set_level(action)) s.default(unknown_command) - result = s.result + print('Result is {}'.format(s.result)) ``` Now compare that to they espoused *pythonic* way: @@ -135,6 +135,7 @@ while True: '': lambda: None, } result = switch.get(action, unknown_command)() + print('Result is {}'.format(result)) ``` Personally, I much prefer to read and write the one above. That's why I wrote this module. @@ -150,7 +151,6 @@ Switch statements are really if / elif / else blocks. So you write the following while True: action = get_action(action) - result = None if action == 'c' or action == 'a': result = create_account() @@ -170,6 +170,8 @@ while True: result = set_level(action) else: unknown_command() + + print('Result is {}'.format(result)) ``` I actually believe this is a little better than the @@ -177,7 +179,7 @@ I actually believe this is a little better than the But there are still things that are harder. * How would you deal with fall-through cleanly? -* Did you notice the bug? We forgot to set result in default case (`else`)? +* Did you notice the bug? We forgot to set result in default case (`else`) and will result in a runtime error? * While it's pretty clear, it's much more verbose and less declarative than the switch version. Again, compare the if / elif / else to what you have with switch. This code is identical except @@ -198,5 +200,5 @@ while True: s.case(range(1,6), lambda: set_level(action)) s.default(unknown_command) - result = s.result + print('Result is {}'.format(s.result)) ``` \ No newline at end of file From a8e641d1db5bc95e3af3cddfd3db60ad8d65acf0 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 21 Sep 2017 09:08:15 -0700 Subject: [PATCH 04/33] Final cleanup for if case. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 22258f1..d4a03dc 100644 --- a/README.md +++ b/README.md @@ -158,11 +158,9 @@ while True: result = log_into_account() elif action == 'r': result = register_cage() - elif action == 'u': + elif action == 'a': result = update_availability() - elif action == 'v': - result = view_bookings() - elif action == 'b': + elif action == 'v' or action == 'b': result = view_bookings() elif action == 'x': result = exit_app() @@ -179,7 +177,9 @@ I actually believe this is a little better than the But there are still things that are harder. * How would you deal with fall-through cleanly? -* Did you notice the bug? We forgot to set result in default case (`else`) and will result in a runtime error? +* Did you notice the bug? We forgot to set result in default case (`else`) and will result in a runtime error (but only if that case hits). +* There is another bug. Update `update_availability` will never run because it's command (`a`) is bound to two cases. +This is guarded against in switch and you would receive a duplicate case error the first time it runs at all. * While it's pretty clear, it's much more verbose and less declarative than the switch version. Again, compare the if / elif / else to what you have with switch. This code is identical except From 00194fb1412e37f7637f5c3a9eef48c18367a9ca Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 22 Sep 2017 11:55:40 -0700 Subject: [PATCH 05/33] Final touch ups for the merging of the PR for fallthrough, thanks @ianepperson --- switchlang.py | 32 ++++++++++++++++++++++++-- tests/coretests.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/switchlang.py b/switchlang.py index bff0f47..0dffc4b 100644 --- a/switchlang.py +++ b/switchlang.py @@ -1,9 +1,13 @@ -# Here is a first pass implementation at adding switch import uuid from typing import Callable, Any class switch: + """ + python-switch is a module-level implementation of the switch statement for Python. + See https://github.com/mikeckennedy/python-switch for full details. + Copyright Michael Kennedy (https://twitter.com/mkennedy) + """ __no_result = uuid.uuid4() __default = uuid.uuid4() @@ -16,9 +20,33 @@ def __init__(self, value): self._func_stack = [] def default(self, func: Callable[[], Any]): + """ + Use as option final statement in switch block. + + with switch(val) as s: + s.case(...) + s.case(...) + s.default(function) + + :param func: Any callable taking no parameters to be executed if this (default) case matches. + :return: None + """ self.case(switch.__default, func) def case(self, key, func: Callable[[], Any], fallthrough=False): + """ + Specify a case for the switch block: + + with switch(val) as s: + s.case('a', function) + s.case('b', function, fallthrough=True) + s.default(function) + + :param key: Key for the case test (if this is a list or range, the items will each be added as a case) + :param func: Any callable taking no parameters to be executed if this case matches. + :param fallthrough: Optionally fall through to the subsequent case (defaults to False) + :return: + """ if fallthrough is not None: if self._falling_through: self._func_stack.append(func) @@ -77,4 +105,4 @@ def closed_range(start: int, stop: int, step=1) -> range: if start >= stop: raise ValueError("Start must be less than stop.") - return range(start, stop+step, step) + return range(start, stop + step, step) diff --git a/tests/coretests.py b/tests/coretests.py index 873cce5..0dfb6d6 100644 --- a/tests/coretests.py +++ b/tests/coretests.py @@ -165,6 +165,62 @@ def test_fallthrough_some_list(self): self.assertEqual(s.result, 7) self.assertEqual(visited, [4, 7]) + def test_fallthrough_then_stop(self): + visited = [] + value = 2 + with switch(value) as s: + s.case(1, lambda: visited.append(1) or 1) + s.case(2, lambda: visited.append(2) or 2, fallthrough=True) + s.case(3, lambda: visited.append(3) or 3, fallthrough=True) + s.case(4, lambda: visited.append(4) or 4) + s.case(5, lambda: visited.append(5) or 5) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, 4) + self.assertEqual(visited, [2, 3, 4]) + + def test_fallthrough_middle_then_stop(self): + visited = [] + value = 3 + with switch(value) as s: + s.case(1, lambda: visited.append(1) or 1) + s.case(2, lambda: visited.append(2) or 2, fallthrough=True) + s.case(3, lambda: visited.append(3) or 3, fallthrough=True) + s.case(4, lambda: visited.append(4) or 4) + s.case(5, lambda: visited.append(5) or 5) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, 4) + self.assertEqual(visited, [3, 4]) + + def test_fallthrough_available_but_not_hit(self): + visited = [] + value = 5 + with switch(value) as s: + s.case(1, lambda: visited.append(1) or 1) + s.case(2, lambda: visited.append(2) or 2, fallthrough=True) + s.case(3, lambda: visited.append(3) or 3, fallthrough=True) + s.case(4, lambda: visited.append(4) or 4) + s.case(5, lambda: visited.append(5) or 5) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, 5) + self.assertEqual(visited, [5]) + + def test_fallthrough__no_match_but_not_hit(self): + visited = [] + value = 'gone' + with switch(value) as s: + s.case(1, lambda: visited.append(1) or 1) + s.case(2, lambda: visited.append(2) or 2, fallthrough=True) + s.case(3, lambda: visited.append(3) or 3, fallthrough=True) + s.case(4, lambda: visited.append(4) or 4) + s.case(5, lambda: visited.append(5) or 5) + s.default(lambda: visited.append('default') or 'default') + + self.assertEqual(s.result, 'default') + self.assertEqual(visited, ['default']) + if __name__ == '__main__': unittest.main() From dfddcc3b95803ddaa8bca95301353982c0b394c9 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 4 Dec 2018 08:53:14 -0800 Subject: [PATCH 06/33] Fixes #8 - Should not accept empty collection as case definition. --- switchlang.py | 9 ++++++++- tests/coretests.py | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/switchlang.py b/switchlang.py index 0dffc4b..1723fbc 100644 --- a/switchlang.py +++ b/switchlang.py @@ -53,13 +53,20 @@ def case(self, key, func: Callable[[], Any], fallthrough=False): if not fallthrough: self._falling_through = False - if isinstance(key, list) or isinstance(key, range): + if isinstance(key, range): + key = list(key) + + if isinstance(key, list): + if not key: + raise ValueError("You cannot pass an empty collection as the case. It will never match.") + found = False for i in key: if self.case(i, func, fallthrough=None): found = True if fallthrough is not None: self._falling_through = fallthrough + return found if key in self.cases: diff --git a/tests/coretests.py b/tests/coretests.py index 0dfb6d6..f343adc 100644 --- a/tests/coretests.py +++ b/tests/coretests.py @@ -221,6 +221,12 @@ def test_fallthrough__no_match_but_not_hit(self): self.assertEqual(s.result, 'default') self.assertEqual(visited, ['default']) + def test_empty_collection_clause_is_error(self): + with self.assertRaises(ValueError): + with switch('val') as s: + s.case([], lambda: None) + s.default(lambda: 'default') + if __name__ == '__main__': unittest.main() From 40d9bf1b7e8b26f400953cd8727eff3c98f53046 Mon Sep 17 00:00:00 2001 From: zach valenta Date: Fri, 5 Jul 2019 15:11:38 -0400 Subject: [PATCH 07/33] fix typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d4a03dc..c29843d 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ while True: print('Result is {}'.format(s.result)) ``` -Now compare that to they espoused *pythonic* way: +Now compare that to the espoused *pythonic* way: ```python # with raw dicts @@ -201,4 +201,4 @@ while True: s.default(unknown_command) print('Result is {}'.format(s.result)) -``` \ No newline at end of file +``` From 393ac1e5923a89e8daad061c9d0cf27e693b44bb Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 5 Jul 2019 14:21:47 -0700 Subject: [PATCH 08/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c29843d..6a29614 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ way to define execution blocks: the `with` statement. from switchlang import switch num = 7 -val = input("Enter a key. a, b, c or any other: ") +val = input("Enter a character, a, b, c or any other: ") with switch(val) as s: s.case('a', process_a) From 50943a6df8ab402850e5cff9bc8b40dc9159434a Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 18 Jul 2019 17:24:00 -0700 Subject: [PATCH 09/33] More f-strings via Flynt. --- switchlang.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/switchlang.py b/switchlang.py index 1723fbc..a41d52f 100644 --- a/switchlang.py +++ b/switchlang.py @@ -70,7 +70,7 @@ def case(self, key, func: Callable[[], Any], fallthrough=False): return found if key in self.cases: - raise ValueError("Duplicate case: {}".format(key)) + raise ValueError(f"Duplicate case: {key}") if not func: raise ValueError("Action for case cannot be None.") if not callable(func): From 6093c591192e3d670c75efe6ebdc897939e63106 Mon Sep 17 00:00:00 2001 From: j2dunham Date: Fri, 30 Aug 2019 09:07:38 -0400 Subject: [PATCH 10/33] fixed typo in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a29614..54ef8a9 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ switch = { 3: method_three } -result = switch.get(value, defult_method_to_run)() +result = switch.get(value, default_method_to_run)() ``` This works but is very low on the functionality level. We have a better solution here From b1feaabe2de6e1dd36aabd4314a3b05af53ba3a7 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 12:10:35 -0700 Subject: [PATCH 11/33] Fix type issue mismatch. --- switchlang.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/switchlang.py b/switchlang.py index a41d52f..bd124d9 100644 --- a/switchlang.py +++ b/switchlang.py @@ -1,5 +1,5 @@ import uuid -from typing import Callable, Any +from typing import Callable, Any, Optional class switch: @@ -33,7 +33,7 @@ def default(self, func: Callable[[], Any]): """ self.case(switch.__default, func) - def case(self, key, func: Callable[[], Any], fallthrough=False): + def case(self, key, func: Callable[[], Any], fallthrough: Optional[bool] = False): """ Specify a case for the switch block: From 4f5d1c1c80f759d8f9bc06ebaa6f29ec9edb80ee Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 12:42:35 -0700 Subject: [PATCH 12/33] Move to use pytest for testing. --- requirements-dev.txt | 2 ++ tests/{coretests.py => test_core.py} | 0 2 files changed, 2 insertions(+) create mode 100644 requirements-dev.txt rename tests/{coretests.py => test_core.py} (100%) diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..0aa42e0 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,2 @@ +pytest +# twine diff --git a/tests/coretests.py b/tests/test_core.py similarity index 100% rename from tests/coretests.py rename to tests/test_core.py From 4029ee135bd9eecdcf2e2b6d0abf3c3e2fb32227 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 12:43:04 -0700 Subject: [PATCH 13/33] Move from switchlang module to a package. --- switchlang/__init__.py | 2 ++ switchlang.py => switchlang/__switchlang_impl.py | 0 2 files changed, 2 insertions(+) create mode 100644 switchlang/__init__.py rename switchlang.py => switchlang/__switchlang_impl.py (100%) diff --git a/switchlang/__init__.py b/switchlang/__init__.py new file mode 100644 index 0000000..c4a334c --- /dev/null +++ b/switchlang/__init__.py @@ -0,0 +1,2 @@ +from switchlang.__switchlang_impl import switch +from switchlang.__switchlang_impl import closed_range diff --git a/switchlang.py b/switchlang/__switchlang_impl.py similarity index 100% rename from switchlang.py rename to switchlang/__switchlang_impl.py From 992b5efa1f2069e40522cf9edb68ae6ec9b96e21 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 13:10:56 -0700 Subject: [PATCH 14/33] Adds setup file for installation / builds. --- README.md | 16 +++++++++++-- setup.py | 54 ++++++++++++++++++++++++++++++++++++++++++ switchlang/__init__.py | 12 ++++++++-- 3 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 setup.py diff --git a/README.md b/README.md index 54ef8a9..5edde27 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ -# python-switch +# switchlang +[![](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/) +[![](https://img.shields.io/pypi/l/markdown-subtemplate.svg)](https://github.com/mikeckennedy/python-switch/blob/master/LICENSE) +[![](https://img.shields.io/pypi/dm/python-switch.svg)](https://test.pypi.org/project/switchlang/) -Adds switch blocks to Python. + +Adds switch blocks to the Python language. This module adds explicit switch functionality to Python without changing the language. It builds upon a standard @@ -29,6 +33,14 @@ def process_with_data(*value): print("Found with data: {}".format(value)) ``` +## Installation + +Simply install via pip: + +```bash +pip install switchlang +``` + ## Features * More explicit than using dictionaries with functions as values. diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..bf5b7de --- /dev/null +++ b/setup.py @@ -0,0 +1,54 @@ +import io +import os +import re + +from setuptools import find_packages +from setuptools import setup + + +def read(filename): + filename = os.path.join(os.path.dirname(__file__), filename) + text_type = type(u"") + with io.open(filename, mode="r", encoding='utf-8') as fd: + return re.sub(text_type(r':[a-z]+:`~?(.*?)`'), text_type(r'``\1``'), fd.read()) + + +def read_version(): + filename = os.path.join(os.path.dirname(__file__), 'switchlang', '__init__.py') + with open(filename, mode="r", encoding='utf-8') as fin: + for line in fin: + if line and line.strip() and line.startswith('__version__'): + return line.split('=')[1].strip().strip("'") + + return "0.0.0.0" + + +requires = [] + +setup( + name="switchlang", + version=read_version(), + url="https://github.com/mikeckennedy/python-switch", + license='MIT', + + author="Michael Kennedy", + author_email="michael@talkpython.fm", + + description="Adds switch blocks to the Python language.", + long_description=read("README.md"), + long_description_content_type='text/markdown', + + packages=find_packages(exclude=('tests',)), + + install_requires=requires, + + classifiers=[ + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + ], +) diff --git a/switchlang/__init__.py b/switchlang/__init__.py index c4a334c..18d146f 100644 --- a/switchlang/__init__.py +++ b/switchlang/__init__.py @@ -1,2 +1,10 @@ -from switchlang.__switchlang_impl import switch -from switchlang.__switchlang_impl import closed_range +""" +switchlang - Adds switch blocks to Python +""" + +__version__ = '0.1.1' +__author__ = 'Michael Kennedy ' +__all__ = ['switch', 'closed_range'] + +from .__switchlang_impl import switch +from .__switchlang_impl import closed_range From d868c215e763dd895ad636919f1890c6ec44178a Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 13:17:10 -0700 Subject: [PATCH 15/33] Add better doc strings. --- switchlang/__init__.py | 4 ++++ switchlang/__switchlang_impl.py | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/switchlang/__init__.py b/switchlang/__init__.py index 18d146f..29a3506 100644 --- a/switchlang/__init__.py +++ b/switchlang/__init__.py @@ -1,5 +1,9 @@ """ switchlang - Adds switch blocks to Python + +See https://github.com/mikeckennedy/python-switch for full details. +Copyright Michael Kennedy (https://twitter.com/mkennedy) +License: MIT """ __version__ = '0.1.1' diff --git a/switchlang/__switchlang_impl.py b/switchlang/__switchlang_impl.py index bd124d9..b5193a5 100644 --- a/switchlang/__switchlang_impl.py +++ b/switchlang/__switchlang_impl.py @@ -4,9 +4,10 @@ class switch: """ - python-switch is a module-level implementation of the switch statement for Python. + switch is a module-level implementation of the switch statement for Python. See https://github.com/mikeckennedy/python-switch for full details. Copyright Michael Kennedy (https://twitter.com/mkennedy) + License: MIT """ __no_result = uuid.uuid4() __default = uuid.uuid4() From f0a4db20b820e9519ba46be92a97b2d33cda6bd0 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 13:24:56 -0700 Subject: [PATCH 16/33] Add better doc strings. --- switchlang/__switchlang_impl.py | 38 +++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/switchlang/__switchlang_impl.py b/switchlang/__switchlang_impl.py index b5193a5..81bfcef 100644 --- a/switchlang/__switchlang_impl.py +++ b/switchlang/__switchlang_impl.py @@ -22,12 +22,14 @@ def __init__(self, value): def default(self, func: Callable[[], Any]): """ - Use as option final statement in switch block. + Use as option final statement in switch block. + ``` with switch(val) as s: s.case(...) s.case(...) s.default(function) + ``` :param func: Any callable taking no parameters to be executed if this (default) case matches. :return: None @@ -36,12 +38,14 @@ def default(self, func: Callable[[], Any]): def case(self, key, func: Callable[[], Any], fallthrough: Optional[bool] = False): """ - Specify a case for the switch block: + Specify a case for the switch block: + ``` with switch(val) as s: s.case('a', function) s.case('b', function, fallthrough=True) s.default(function) + ``` :param key: Key for the case test (if this is a list or range, the items will each be added as a case) :param func: Any callable taking no parameters to be executed if this case matches. @@ -102,6 +106,20 @@ def __exit__(self, exc_type, exc_val, exc_tb): @property def result(self): + """ + The value captured from the method called for a given case. + + ``` + value = 4 + with switch(value) as s: + s.case(closed_range(1, 5), lambda: "1-to-5") + # ... + + res = s.result # res == '1-to-5' + ``` + + :return: The value captured from the method called for a given case. + """ if self.__result == switch.__no_result: raise Exception("No result has been computed (did you access " "switch.result inside the with block?)") @@ -110,6 +128,22 @@ def result(self): def closed_range(start: int, stop: int, step=1) -> range: + """ + Creates a closed range that allows you to specify a case + from [start, stop] inclusively. + + ``` + with switch(value) as s: + s.case(closed_range(1, 5), lambda: "1-to-5") + s.case(closed_range(6, 7), lambda: "6") + s.default(lambda: 'default') + ``` + + :param start: The inclusive lower bound of the range [start, stop]. + :param stop: The inclusive upper bound of the range [start, stop]. + :param step: The step size between elements (defaults to 1). + :return: A range() generator that has a closed upper bound. + """ if start >= stop: raise ValueError("Start must be less than stop.") From d6b7942ee01be05b56c321ecb18a57cda43c1e5c Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Mar 2020 13:27:50 -0700 Subject: [PATCH 17/33] Set version to 0.1.0 to kick off the pypi listing, fixes #5 --- switchlang/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/switchlang/__init__.py b/switchlang/__init__.py index 29a3506..b14ca62 100644 --- a/switchlang/__init__.py +++ b/switchlang/__init__.py @@ -6,7 +6,7 @@ License: MIT """ -__version__ = '0.1.1' +__version__ = '0.1.0' __author__ = 'Michael Kennedy ' __all__ = ['switch', 'closed_range'] From e0cd9e32269a0b7a6006c9c07a8a3c39bdb668de Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Sun, 22 Mar 2020 09:48:45 -0700 Subject: [PATCH 18/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5edde27..a3d4ae4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # switchlang [![](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/) [![](https://img.shields.io/pypi/l/markdown-subtemplate.svg)](https://github.com/mikeckennedy/python-switch/blob/master/LICENSE) -[![](https://img.shields.io/pypi/dm/python-switch.svg)](https://test.pypi.org/project/switchlang/) +[![](https://img.shields.io/pypi/dm/switchlang.svg)](https://test.pypi.org/project/switchlang/) Adds switch blocks to the Python language. From e586414216e31171e79b23e259590bb3375b5aa9 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Sun, 22 Mar 2020 09:50:15 -0700 Subject: [PATCH 19/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a3d4ae4..87fe31b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # switchlang [![](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/) [![](https://img.shields.io/pypi/l/markdown-subtemplate.svg)](https://github.com/mikeckennedy/python-switch/blob/master/LICENSE) -[![](https://img.shields.io/pypi/dm/switchlang.svg)](https://test.pypi.org/project/switchlang/) +[![](https://img.shields.io/pypi/dm/switchlang.svg)](https://pypi.org/project/switchlang/) Adds switch blocks to the Python language. From 5026674fc41db573a5b5a0e33c0070e71e525b83 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 21 May 2020 17:01:12 -0700 Subject: [PATCH 20/33] Update README.md --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 87fe31b..996ea0a 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,14 @@ way to define execution blocks: the `with` statement. ```python from switchlang import switch -num = 7 -val = input("Enter a character, a, b, c or any other: ") - -with switch(val) as s: - s.case('a', process_a) - s.case('b', lambda: process_with_data(val, num, 'other values still')) - s.default(process_any) +def main(): + num = 7 + val = input("Enter a character, a, b, c or any other: ") + + with switch(val) as s: + s.case('a', process_a) + s.case('b', lambda: process_with_data(val, num, 'other values still')) + s.default(process_any) def process_a(): print("Found A!") @@ -31,6 +32,8 @@ def process_any(): def process_with_data(*value): print("Found with data: {}".format(value)) + +main() ``` ## Installation From 95a4692e5fc8b553b9df1052b95a4cba5db155ef Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Sep 2025 13:16:16 -0700 Subject: [PATCH 21/33] =?UTF-8?q?Refactor=20codebase=20for=20consistent=20?= =?UTF-8?q?double=E2=80=91quoted=20strings=20and=20add=20type=20hints?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This update replaces single‑quoted literals with double quotes throughout the repository, standardizes string formatting in `setup.py`, `__init__.py`, and test files, and introduces comprehensive type annotations to improve readability and static analysis support. The changes also clean up import statements, adjust exception messages for clarity, and ensure the package metadata uses consistent quoting conventions. πŸš€ --- setup.py | 39 +++++++++------------ switchlang/__init__.py | 6 ++-- switchlang/__switchlang_impl.py | 46 +++++++++++++++--------- tests/test_core.py | 62 ++++++++++++++++----------------- 4 files changed, 80 insertions(+), 73 deletions(-) diff --git a/setup.py b/setup.py index bf5b7de..e37e6fc 100644 --- a/setup.py +++ b/setup.py @@ -8,17 +8,17 @@ def read(filename): filename = os.path.join(os.path.dirname(__file__), filename) - text_type = type(u"") - with io.open(filename, mode="r", encoding='utf-8') as fd: - return re.sub(text_type(r':[a-z]+:`~?(.*?)`'), text_type(r'``\1``'), fd.read()) + text_type = type("") + with io.open(filename, mode="r", encoding="utf-8") as fd: + return re.sub(text_type(r":[a-z]+:`~?(.*?)`"), text_type(r"``\1``"), fd.read()) def read_version(): - filename = os.path.join(os.path.dirname(__file__), 'switchlang', '__init__.py') - with open(filename, mode="r", encoding='utf-8') as fin: + filename = os.path.join(os.path.dirname(__file__), "switchlang", "__init__.py") + with open(filename, mode="r", encoding="utf-8") as fin: for line in fin: - if line and line.strip() and line.startswith('__version__'): - return line.split('=')[1].strip().strip("'") + if line and line.strip() and line.startswith("__version__"): + return line.split("=")[1].strip().strip("'") return "0.0.0.0" @@ -29,26 +29,21 @@ def read_version(): name="switchlang", version=read_version(), url="https://github.com/mikeckennedy/python-switch", - license='MIT', - + license="MIT", author="Michael Kennedy", author_email="michael@talkpython.fm", - description="Adds switch blocks to the Python language.", long_description=read("README.md"), - long_description_content_type='text/markdown', - - packages=find_packages(exclude=('tests',)), - + long_description_content_type="text/markdown", + packages=find_packages(exclude=("tests",)), install_requires=requires, - classifiers=[ - 'Development Status :: 4 - Beta', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', + "Development Status :: 4 - Beta", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], ) diff --git a/switchlang/__init__.py b/switchlang/__init__.py index b14ca62..543738b 100644 --- a/switchlang/__init__.py +++ b/switchlang/__init__.py @@ -6,9 +6,9 @@ License: MIT """ -__version__ = '0.1.0' -__author__ = 'Michael Kennedy ' -__all__ = ['switch', 'closed_range'] +__version__ = "0.1.1" +__author__ = "Michael Kennedy " +__all__ = ["switch", "closed_range"] from .__switchlang_impl import switch from .__switchlang_impl import closed_range diff --git a/switchlang/__switchlang_impl.py b/switchlang/__switchlang_impl.py index 81bfcef..eb4384a 100644 --- a/switchlang/__switchlang_impl.py +++ b/switchlang/__switchlang_impl.py @@ -1,26 +1,27 @@ +import typing import uuid -from typing import Callable, Any, Optional class switch: """ - switch is a module-level implementation of the switch statement for Python. - See https://github.com/mikeckennedy/python-switch for full details. - Copyright Michael Kennedy (https://twitter.com/mkennedy) - License: MIT + switch is a module-level implementation of the switch statement for Python. + See https://github.com/mikeckennedy/python-switch for full details. + Copyright Michael Kennedy (https://mkennedy.codes) + License: MIT """ - __no_result = uuid.uuid4() - __default = uuid.uuid4() - def __init__(self, value): + __no_result: typing.Any = uuid.uuid4() + __default: typing.Any = uuid.uuid4() + + def __init__(self, value: typing.Any): self.value = value - self.cases = set() + self.cases: typing.Set[typing.Any] = set() self._found = False self.__result = switch.__no_result self._falling_through = False - self._func_stack = [] + self._func_stack: typing.List[typing.Callable[[], typing.Any]] = [] - def default(self, func: Callable[[], Any]): + def default(self, func: typing.Callable[[], typing.Any]): """ Use as option final statement in switch block. @@ -36,7 +37,12 @@ def default(self, func: Callable[[], Any]): """ self.case(switch.__default, func) - def case(self, key, func: Callable[[], Any], fallthrough: Optional[bool] = False): + def case( + self, + key: typing.Any, + func: typing.Callable[[], typing.Any], + fallthrough: typing.Optional[bool] = False, + ): """ Specify a case for the switch block: @@ -63,7 +69,9 @@ def case(self, key, func: Callable[[], Any], fallthrough: Optional[bool] = False if isinstance(key, list): if not key: - raise ValueError("You cannot pass an empty collection as the case. It will never match.") + raise ValueError( + "You cannot pass an empty collection as the case. It will never match." + ) found = False for i in key: @@ -97,8 +105,10 @@ def __exit__(self, exc_type, exc_val, exc_tb): raise exc_val if not self._func_stack: - raise Exception("Value does not match any case and there " - "is no default case: value {}".format(self.value)) + raise Exception( + "Value does not match any case and there " + "is no default case: value {}".format(self.value) + ) for func in self._func_stack: # noinspection PyCallingNonCallable @@ -121,8 +131,10 @@ def result(self): :return: The value captured from the method called for a given case. """ if self.__result == switch.__no_result: - raise Exception("No result has been computed (did you access " - "switch.result inside the with block?)") + raise Exception( + "No result has been computed (did you access " + "switch.result inside the with block?)" + ) return self.__result diff --git a/tests/test_core.py b/tests/test_core.py index f343adc..448858c 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -14,7 +14,7 @@ def test_has_matched_case_int(self): s.case(1, lambda: "one") s.case(5, lambda: "five") s.case(7, lambda: "seven") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "seven") @@ -34,29 +34,29 @@ def test_has_matched_case_object(self): def test_default_passthrough(self): value = 11 with switch(value) as s: - s.case(1, lambda: '1') - s.case(2, lambda: '2') - s.default(lambda: 'default') + s.case(1, lambda: "1") + s.case(2, lambda: "2") + s.default(lambda: "default") self.assertEqual(s.result, "default") def test_none_as_valid_case(self): with switch(None) as s: - s.case(1, lambda: 'one') - s.case(None, lambda: 'none') + s.case(1, lambda: "one") + s.case(None, lambda: "none") s.default(lambda: "default") - self.assertEqual(s.result, 'none') + self.assertEqual(s.result, "none") def test_error_no_match_no_default(self): with self.assertRaises(Exception): - with switch('val') as s: + with switch("val") as s: s.case(1, lambda: None) s.case(2, lambda: None) def test_error_duplicate_case(self): with self.assertRaises(ValueError): - with switch('val') as s: + with switch("val") as s: s.case(1, lambda: None) s.case(1, lambda: None) @@ -65,7 +65,7 @@ def test_multiple_values_one_case_range(self): with switch(value) as s: s.case(range(1, 6), lambda: "1-to-5") s.case(range(6, 7), lambda: "6") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "1-to-5") @@ -73,14 +73,14 @@ def test_multiple_values_one_case_range(self): with switch(value) as s: s.case(range(1, 6), lambda: "1-to-5") s.case(range(6, 7), lambda: "6") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "6") with switch(7) as s: s.case(range(1, 6), lambda: "1-to-5") s.case(range(6, 7), lambda: "6") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "default") @@ -88,7 +88,7 @@ def test_multiple_values_one_case_list(self): with switch(6) as s: s.case([1, 3, 5, 7], lambda: "odd") s.case([0, 2, 4, 6, 8], lambda: "even") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "even") @@ -112,21 +112,21 @@ def test_closed_range(self): with switch(value) as s: s.case(closed_range(1, 5), lambda: "1-to-5") s.case(closed_range(6, 7), lambda: "6") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "1-to-5") with switch(0) as s: s.case(closed_range(1, 5), lambda: "1-to-5") s.case(closed_range(6, 7), lambda: "6") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "default") with switch(6) as s: s.case(closed_range(1, 5), lambda: "1-to-5") s.case(closed_range(6, 7), lambda: "6") - s.default(lambda: 'default') + s.default(lambda: "default") self.assertEqual(s.result, "6") @@ -136,10 +136,10 @@ def test_fallthrough_simple(self): with switch(value) as s: s.case(1, lambda: visited.append(1) or 1) s.case(2, lambda: visited.append(2) or 2, fallthrough=True) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") self.assertEqual(s.result, "default") - self.assertEqual(visited, [2, 'default']) + self.assertEqual(visited, [2, "default"]) def test_fallthrough_list(self): visited = [] @@ -148,10 +148,10 @@ def test_fallthrough_list(self): s.case([1, 2, 3], lambda: visited.append(1) or 1) s.case([4, 5, 6], lambda: visited.append(4) or 4, fallthrough=True) s.case([7, 8, 9], lambda: visited.append(7) or 7, fallthrough=True) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") self.assertEqual(s.result, "default") - self.assertEqual(visited, [4, 7, 'default']) + self.assertEqual(visited, [4, 7, "default"]) def test_fallthrough_some_list(self): visited = [] @@ -160,7 +160,7 @@ def test_fallthrough_some_list(self): s.case([1, 2, 3], lambda: visited.append(1) or 1) s.case([4, 5, 6], lambda: visited.append(4) or 4, fallthrough=True) s.case([7, 8, 9], lambda: visited.append(7) or 7) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") self.assertEqual(s.result, 7) self.assertEqual(visited, [4, 7]) @@ -174,7 +174,7 @@ def test_fallthrough_then_stop(self): s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") self.assertEqual(s.result, 4) self.assertEqual(visited, [2, 3, 4]) @@ -188,7 +188,7 @@ def test_fallthrough_middle_then_stop(self): s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") self.assertEqual(s.result, 4) self.assertEqual(visited, [3, 4]) @@ -202,31 +202,31 @@ def test_fallthrough_available_but_not_hit(self): s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") self.assertEqual(s.result, 5) self.assertEqual(visited, [5]) def test_fallthrough__no_match_but_not_hit(self): visited = [] - value = 'gone' + value = "gone" with switch(value) as s: s.case(1, lambda: visited.append(1) or 1) s.case(2, lambda: visited.append(2) or 2, fallthrough=True) s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append('default') or 'default') + s.default(lambda: visited.append("default") or "default") - self.assertEqual(s.result, 'default') - self.assertEqual(visited, ['default']) + self.assertEqual(s.result, "default") + self.assertEqual(visited, ["default"]) def test_empty_collection_clause_is_error(self): with self.assertRaises(ValueError): - with switch('val') as s: + with switch("val") as s: s.case([], lambda: None) - s.default(lambda: 'default') + s.default(lambda: "default") -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() From c24f7739a892ad9f2f04bdeb2f2e05e3eb1bd1f9 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Sep 2025 13:18:37 -0700 Subject: [PATCH 22/33] Add ruff toml and fix build that didn't account for " vs. ' --- ruff.toml | 43 ++++++++++++ setup.py | 48 ++++++------- switchlang/__init__.py | 6 +- switchlang/__switchlang_impl.py | 22 ++---- tests/test_core.py | 120 ++++++++++++++++---------------- 5 files changed, 137 insertions(+), 102 deletions(-) create mode 100644 ruff.toml diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..eee74ff --- /dev/null +++ b/ruff.toml @@ -0,0 +1,43 @@ +# [ruff] +line-length = 120 +format.quote-style = "single" + +# Enable Pyflakes `E` and `F` codes by default. +lint.select = ["E", "F"] +lint.ignore = [] + +# Exclude a variety of commonly ignored directories. +exclude = [ + ".bzr", + ".direnv", + ".eggs", + ".git", + ".hg", + ".mypy_cache", + ".nox", + ".pants.d", + ".ruff_cache", + ".svn", + ".tox", + "__pypackages__", + "_build", + "buck-out", + "build", + "dist", + "node_modules", + ".env", + ".venv", + "venv", + "typings/**/*.pyi", +] +lint.per-file-ignores = { } + +# Allow unused variables when underscore-prefixed. +# dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +# Assume Python 3.13. +target-version = "py313" + +#[tool.ruff.mccabe] +## Unlike Flake8, default to a complexity level of 10. +lint.mccabe.max-complexity = 10 diff --git a/setup.py b/setup.py index e37e6fc..f4d8418 100644 --- a/setup.py +++ b/setup.py @@ -8,42 +8,42 @@ def read(filename): filename = os.path.join(os.path.dirname(__file__), filename) - text_type = type("") - with io.open(filename, mode="r", encoding="utf-8") as fd: - return re.sub(text_type(r":[a-z]+:`~?(.*?)`"), text_type(r"``\1``"), fd.read()) + text_type = type('') + with io.open(filename, mode='r', encoding='utf-8') as fd: + return re.sub(text_type(r':[a-z]+:`~?(.*?)`'), text_type(r'``\1``'), fd.read()) def read_version(): - filename = os.path.join(os.path.dirname(__file__), "switchlang", "__init__.py") - with open(filename, mode="r", encoding="utf-8") as fin: + filename = os.path.join(os.path.dirname(__file__), 'switchlang', '__init__.py') + with open(filename, mode='r', encoding='utf-8') as fin: for line in fin: - if line and line.strip() and line.startswith("__version__"): - return line.split("=")[1].strip().strip("'") + if line and line.strip() and line.startswith('__version__'): + return line.split('=')[1].strip().strip("'") - return "0.0.0.0" + return '0.0.0.0' requires = [] setup( - name="switchlang", + name='switchlang', version=read_version(), - url="https://github.com/mikeckennedy/python-switch", - license="MIT", - author="Michael Kennedy", - author_email="michael@talkpython.fm", - description="Adds switch blocks to the Python language.", - long_description=read("README.md"), - long_description_content_type="text/markdown", - packages=find_packages(exclude=("tests",)), + url='https://github.com/mikeckennedy/python-switch', + license='MIT', + author='Michael Kennedy', + author_email='michael@talkpython.fm', + description='Adds switch blocks to the Python language.', + long_description=read('README.md'), + long_description_content_type='text/markdown', + packages=find_packages(exclude=('tests',)), install_requires=requires, classifiers=[ - "Development Status :: 4 - Beta", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', ], ) diff --git a/switchlang/__init__.py b/switchlang/__init__.py index 543738b..29a3506 100644 --- a/switchlang/__init__.py +++ b/switchlang/__init__.py @@ -6,9 +6,9 @@ License: MIT """ -__version__ = "0.1.1" -__author__ = "Michael Kennedy " -__all__ = ["switch", "closed_range"] +__version__ = '0.1.1' +__author__ = 'Michael Kennedy ' +__all__ = ['switch', 'closed_range'] from .__switchlang_impl import switch from .__switchlang_impl import closed_range diff --git a/switchlang/__switchlang_impl.py b/switchlang/__switchlang_impl.py index eb4384a..5def359 100644 --- a/switchlang/__switchlang_impl.py +++ b/switchlang/__switchlang_impl.py @@ -69,9 +69,7 @@ def case( if isinstance(key, list): if not key: - raise ValueError( - "You cannot pass an empty collection as the case. It will never match." - ) + raise ValueError('You cannot pass an empty collection as the case. It will never match.') found = False for i in key: @@ -83,11 +81,11 @@ def case( return found if key in self.cases: - raise ValueError(f"Duplicate case: {key}") + raise ValueError(f'Duplicate case: {key}') if not func: - raise ValueError("Action for case cannot be None.") + raise ValueError('Action for case cannot be None.') if not callable(func): - raise ValueError("Func must be callable.") + raise ValueError('Func must be callable.') self.cases.add(key) if key == self.value or not self._found and key == self.__default: @@ -105,10 +103,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): raise exc_val if not self._func_stack: - raise Exception( - "Value does not match any case and there " - "is no default case: value {}".format(self.value) - ) + raise Exception('Value does not match any case and there is no default case: value {}'.format(self.value)) for func in self._func_stack: # noinspection PyCallingNonCallable @@ -131,10 +126,7 @@ def result(self): :return: The value captured from the method called for a given case. """ if self.__result == switch.__no_result: - raise Exception( - "No result has been computed (did you access " - "switch.result inside the with block?)" - ) + raise Exception('No result has been computed (did you access switch.result inside the with block?)') return self.__result @@ -157,6 +149,6 @@ def closed_range(start: int, stop: int, step=1) -> range: :return: A range() generator that has a closed upper bound. """ if start >= stop: - raise ValueError("Start must be less than stop.") + raise ValueError('Start must be less than stop.') return range(start, stop + step, step) diff --git a/tests/test_core.py b/tests/test_core.py index 448858c..bfe73f5 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -11,12 +11,12 @@ class CoreTests(unittest.TestCase): def test_has_matched_case_int(self): value = 7 with switch(value) as s: - s.case(1, lambda: "one") - s.case(5, lambda: "five") - s.case(7, lambda: "seven") - s.default(lambda: "default") + s.case(1, lambda: 'one') + s.case(5, lambda: 'five') + s.case(7, lambda: 'seven') + s.default(lambda: 'default') - self.assertEqual(s.result, "seven") + self.assertEqual(s.result, 'seven') def test_has_matched_case_object(self): t1 = TestKeyObject() @@ -34,63 +34,63 @@ def test_has_matched_case_object(self): def test_default_passthrough(self): value = 11 with switch(value) as s: - s.case(1, lambda: "1") - s.case(2, lambda: "2") - s.default(lambda: "default") + s.case(1, lambda: '1') + s.case(2, lambda: '2') + s.default(lambda: 'default') - self.assertEqual(s.result, "default") + self.assertEqual(s.result, 'default') def test_none_as_valid_case(self): with switch(None) as s: - s.case(1, lambda: "one") - s.case(None, lambda: "none") - s.default(lambda: "default") + s.case(1, lambda: 'one') + s.case(None, lambda: 'none') + s.default(lambda: 'default') - self.assertEqual(s.result, "none") + self.assertEqual(s.result, 'none') def test_error_no_match_no_default(self): with self.assertRaises(Exception): - with switch("val") as s: + with switch('val') as s: s.case(1, lambda: None) s.case(2, lambda: None) def test_error_duplicate_case(self): with self.assertRaises(ValueError): - with switch("val") as s: + with switch('val') as s: s.case(1, lambda: None) s.case(1, lambda: None) def test_multiple_values_one_case_range(self): for value in range(1, 5): with switch(value) as s: - s.case(range(1, 6), lambda: "1-to-5") - s.case(range(6, 7), lambda: "6") - s.default(lambda: "default") + s.case(range(1, 6), lambda: '1-to-5') + s.case(range(6, 7), lambda: '6') + s.default(lambda: 'default') - self.assertEqual(s.result, "1-to-5") + self.assertEqual(s.result, '1-to-5') for value in range(6, 7): with switch(value) as s: - s.case(range(1, 6), lambda: "1-to-5") - s.case(range(6, 7), lambda: "6") - s.default(lambda: "default") + s.case(range(1, 6), lambda: '1-to-5') + s.case(range(6, 7), lambda: '6') + s.default(lambda: 'default') - self.assertEqual(s.result, "6") + self.assertEqual(s.result, '6') with switch(7) as s: - s.case(range(1, 6), lambda: "1-to-5") - s.case(range(6, 7), lambda: "6") - s.default(lambda: "default") + s.case(range(1, 6), lambda: '1-to-5') + s.case(range(6, 7), lambda: '6') + s.default(lambda: 'default') - self.assertEqual(s.result, "default") + self.assertEqual(s.result, 'default') def test_multiple_values_one_case_list(self): with switch(6) as s: - s.case([1, 3, 5, 7], lambda: "odd") - s.case([0, 2, 4, 6, 8], lambda: "even") - s.default(lambda: "default") + s.case([1, 3, 5, 7], lambda: 'odd') + s.case([0, 2, 4, 6, 8], lambda: 'even') + s.default(lambda: 'default') - self.assertEqual(s.result, "even") + self.assertEqual(s.result, 'even') def test_return_value_from_case(self): value = 4 @@ -110,25 +110,25 @@ def test_result_inaccessible_if_hasnt_run(self): def test_closed_range(self): for value in [1, 2, 3, 4, 5]: with switch(value) as s: - s.case(closed_range(1, 5), lambda: "1-to-5") - s.case(closed_range(6, 7), lambda: "6") - s.default(lambda: "default") + s.case(closed_range(1, 5), lambda: '1-to-5') + s.case(closed_range(6, 7), lambda: '6') + s.default(lambda: 'default') - self.assertEqual(s.result, "1-to-5") + self.assertEqual(s.result, '1-to-5') with switch(0) as s: - s.case(closed_range(1, 5), lambda: "1-to-5") - s.case(closed_range(6, 7), lambda: "6") - s.default(lambda: "default") + s.case(closed_range(1, 5), lambda: '1-to-5') + s.case(closed_range(6, 7), lambda: '6') + s.default(lambda: 'default') - self.assertEqual(s.result, "default") + self.assertEqual(s.result, 'default') with switch(6) as s: - s.case(closed_range(1, 5), lambda: "1-to-5") - s.case(closed_range(6, 7), lambda: "6") - s.default(lambda: "default") + s.case(closed_range(1, 5), lambda: '1-to-5') + s.case(closed_range(6, 7), lambda: '6') + s.default(lambda: 'default') - self.assertEqual(s.result, "6") + self.assertEqual(s.result, '6') def test_fallthrough_simple(self): visited = [] @@ -136,10 +136,10 @@ def test_fallthrough_simple(self): with switch(value) as s: s.case(1, lambda: visited.append(1) or 1) s.case(2, lambda: visited.append(2) or 2, fallthrough=True) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') - self.assertEqual(s.result, "default") - self.assertEqual(visited, [2, "default"]) + self.assertEqual(s.result, 'default') + self.assertEqual(visited, [2, 'default']) def test_fallthrough_list(self): visited = [] @@ -148,10 +148,10 @@ def test_fallthrough_list(self): s.case([1, 2, 3], lambda: visited.append(1) or 1) s.case([4, 5, 6], lambda: visited.append(4) or 4, fallthrough=True) s.case([7, 8, 9], lambda: visited.append(7) or 7, fallthrough=True) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') - self.assertEqual(s.result, "default") - self.assertEqual(visited, [4, 7, "default"]) + self.assertEqual(s.result, 'default') + self.assertEqual(visited, [4, 7, 'default']) def test_fallthrough_some_list(self): visited = [] @@ -160,7 +160,7 @@ def test_fallthrough_some_list(self): s.case([1, 2, 3], lambda: visited.append(1) or 1) s.case([4, 5, 6], lambda: visited.append(4) or 4, fallthrough=True) s.case([7, 8, 9], lambda: visited.append(7) or 7) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') self.assertEqual(s.result, 7) self.assertEqual(visited, [4, 7]) @@ -174,7 +174,7 @@ def test_fallthrough_then_stop(self): s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') self.assertEqual(s.result, 4) self.assertEqual(visited, [2, 3, 4]) @@ -188,7 +188,7 @@ def test_fallthrough_middle_then_stop(self): s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') self.assertEqual(s.result, 4) self.assertEqual(visited, [3, 4]) @@ -202,31 +202,31 @@ def test_fallthrough_available_but_not_hit(self): s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') self.assertEqual(s.result, 5) self.assertEqual(visited, [5]) def test_fallthrough__no_match_but_not_hit(self): visited = [] - value = "gone" + value = 'gone' with switch(value) as s: s.case(1, lambda: visited.append(1) or 1) s.case(2, lambda: visited.append(2) or 2, fallthrough=True) s.case(3, lambda: visited.append(3) or 3, fallthrough=True) s.case(4, lambda: visited.append(4) or 4) s.case(5, lambda: visited.append(5) or 5) - s.default(lambda: visited.append("default") or "default") + s.default(lambda: visited.append('default') or 'default') - self.assertEqual(s.result, "default") - self.assertEqual(visited, ["default"]) + self.assertEqual(s.result, 'default') + self.assertEqual(visited, ['default']) def test_empty_collection_clause_is_error(self): with self.assertRaises(ValueError): - with switch("val") as s: + with switch('val') as s: s.case([], lambda: None) - s.default(lambda: "default") + s.default(lambda: 'default') -if __name__ == "__main__": +if __name__ == '__main__': unittest.main() From f390438df6a3434882ff01fc4105ca1a977ba0ba Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Wed, 15 Oct 2025 17:18:50 -0700 Subject: [PATCH 23/33] ruff settings --- ruff.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruff.toml b/ruff.toml index eee74ff..8c1e8a7 100644 --- a/ruff.toml +++ b/ruff.toml @@ -3,7 +3,7 @@ line-length = 120 format.quote-style = "single" # Enable Pyflakes `E` and `F` codes by default. -lint.select = ["E", "F"] +lint.select = ["E", "F", "I"] lint.ignore = [] # Exclude a variety of commonly ignored directories. From fd6f59eea091ba35673c6f955ae00e448e02c884 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Jun 2026 08:36:24 -0700 Subject: [PATCH 24/33] Add docs via great docs --- .gitignore | 5 + .vscode/launch.json | 33 + .vscode/tasks.json | 16 + README.md | 10 +- docs/.well-known/agent-skills/index.json | 11 + .../agent-skills/switchlang/SKILL.md | 40 + docs/.well-known/skills/default/SKILL.md | 40 + docs/JetBrainsMono-Bold.subset.woff2 | Bin 0 -> 25484 bytes docs/JetBrainsMono-Regular.subset.woff2 | Bin 0 -> 24736 bytes docs/back-to-top.js | 122 + docs/changelog.html | 543 +++++ docs/changelog.md | 14 + docs/color-swatch.js | 186 ++ docs/copy-code.js | 176 ++ docs/copy-page.js | 149 ++ docs/dark-mode-toggle.js | 321 +++ docs/details.js | 198 ++ docs/github-widget.js | 313 +++ docs/index.html | 776 ++++++ docs/keyboard-nav.js | 1139 +++++++++ docs/license.html | 624 +++++ docs/llms-full.txt | 41 + docs/llms.txt | 19 + docs/mermaid-renderer.js | 205 ++ docs/navbar-widgets.js | 196 ++ docs/on-this-page.js | 290 +++ docs/reference/closed_range.html | 703 ++++++ docs/reference/closed_range.md | 43 + docs/reference/index.html | 626 +++++ docs/reference/index.md | 21 + docs/reference/switch.html | 942 ++++++++ docs/reference/switch.md | 194 ++ docs/responsive-tables.js | 346 +++ docs/robots.txt | 6 + docs/search.json | 207 ++ docs/sidebar-filter.js | 295 +++ docs/sidebar-float.js | 197 ++ docs/sidebar-wrap.js | 162 ++ ...p-aa1552726bdd3cb78d40c93fdbd5382a.min.css | 12 + docs/site_libs/bootstrap/bootstrap-icons.css | 2106 +++++++++++++++++ docs/site_libs/bootstrap/bootstrap-icons.woff | Bin 0 -> 180288 bytes docs/site_libs/bootstrap/bootstrap.min.js | 7 + docs/site_libs/clipboard/clipboard.min.js | 7 + docs/site_libs/quarto-html/anchor.min.js | 9 + docs/site_libs/quarto-html/popper.min.js | 6 + ...hting-15634bcf2e68342d4ad2dfa704d543f6.css | 236 ++ docs/site_libs/quarto-html/quarto.js | 845 +++++++ docs/site_libs/quarto-html/tabsets/tabsets.js | 95 + docs/site_libs/quarto-html/tippy.css | 1 + docs/site_libs/quarto-html/tippy.umd.min.js | 2 + docs/site_libs/quarto-nav/headroom.min.js | 7 + docs/site_libs/quarto-nav/quarto-nav.js | 325 +++ .../quarto-search/autocomplete.umd.js | 3 + docs/site_libs/quarto-search/fuse.min.js | 9 + docs/site_libs/quarto-search/quarto-search.js | 1457 ++++++++++++ docs/sitemap.xml | 45 + docs/skill.md | 40 + docs/skills.html | 635 +++++ docs/termshow.css | 649 +++++ docs/termshow.js | 1035 ++++++++ docs/theme-init.js | 54 + docs/tooltips.js | 344 +++ docs/video-embed.js | 72 + great-docs.yml | 67 + pyproject.toml | 45 + requirements-dev.txt | 2 - scripts/build_docs.py | 43 + scripts/serve_docs.py | 52 + setup.py | 49 - switchlang/__init__.py | 11 +- switchlang/__switchlang_impl.py | 17 +- switchlang/py.typed | 0 tests/test_core.py | 3 +- 73 files changed, 17438 insertions(+), 61 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 docs/.well-known/agent-skills/index.json create mode 100644 docs/.well-known/agent-skills/switchlang/SKILL.md create mode 100644 docs/.well-known/skills/default/SKILL.md create mode 100644 docs/JetBrainsMono-Bold.subset.woff2 create mode 100644 docs/JetBrainsMono-Regular.subset.woff2 create mode 100644 docs/back-to-top.js create mode 100644 docs/changelog.html create mode 100644 docs/changelog.md create mode 100644 docs/color-swatch.js create mode 100644 docs/copy-code.js create mode 100644 docs/copy-page.js create mode 100644 docs/dark-mode-toggle.js create mode 100644 docs/details.js create mode 100644 docs/github-widget.js create mode 100644 docs/index.html create mode 100644 docs/keyboard-nav.js create mode 100644 docs/license.html create mode 100644 docs/llms-full.txt create mode 100644 docs/llms.txt create mode 100644 docs/mermaid-renderer.js create mode 100644 docs/navbar-widgets.js create mode 100644 docs/on-this-page.js create mode 100644 docs/reference/closed_range.html create mode 100644 docs/reference/closed_range.md create mode 100644 docs/reference/index.html create mode 100644 docs/reference/index.md create mode 100644 docs/reference/switch.html create mode 100644 docs/reference/switch.md create mode 100644 docs/responsive-tables.js create mode 100644 docs/robots.txt create mode 100644 docs/search.json create mode 100644 docs/sidebar-filter.js create mode 100644 docs/sidebar-float.js create mode 100644 docs/sidebar-wrap.js create mode 100644 docs/site_libs/bootstrap/bootstrap-aa1552726bdd3cb78d40c93fdbd5382a.min.css create mode 100644 docs/site_libs/bootstrap/bootstrap-icons.css create mode 100644 docs/site_libs/bootstrap/bootstrap-icons.woff create mode 100644 docs/site_libs/bootstrap/bootstrap.min.js create mode 100644 docs/site_libs/clipboard/clipboard.min.js create mode 100644 docs/site_libs/quarto-html/anchor.min.js create mode 100644 docs/site_libs/quarto-html/popper.min.js create mode 100644 docs/site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css create mode 100644 docs/site_libs/quarto-html/quarto.js create mode 100644 docs/site_libs/quarto-html/tabsets/tabsets.js create mode 100644 docs/site_libs/quarto-html/tippy.css create mode 100644 docs/site_libs/quarto-html/tippy.umd.min.js create mode 100644 docs/site_libs/quarto-nav/headroom.min.js create mode 100644 docs/site_libs/quarto-nav/quarto-nav.js create mode 100644 docs/site_libs/quarto-search/autocomplete.umd.js create mode 100644 docs/site_libs/quarto-search/fuse.min.js create mode 100644 docs/site_libs/quarto-search/quarto-search.js create mode 100644 docs/sitemap.xml create mode 100644 docs/skill.md create mode 100644 docs/skills.html create mode 100644 docs/termshow.css create mode 100644 docs/termshow.js create mode 100644 docs/theme-init.js create mode 100644 docs/tooltips.js create mode 100644 docs/video-embed.js create mode 100644 great-docs.yml create mode 100644 pyproject.toml delete mode 100644 requirements-dev.txt create mode 100644 scripts/build_docs.py create mode 100644 scripts/serve_docs.py delete mode 100644 setup.py create mode 100644 switchlang/py.typed diff --git a/.gitignore b/.gitignore index 265a4a5..2dba73d 100644 --- a/.gitignore +++ b/.gitignore @@ -100,3 +100,8 @@ ENV/ # mypy .mypy_cache/ .idea + +great-docs/ +.ruff_cache/ +.pytest_cache/ +docs/build-timings.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..3d036b0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Build Docs", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/scripts/build_docs.py", + "console": "integratedTerminal", + "python": "${workspaceFolder}/venv/bin/python", + "cwd": "${workspaceFolder}" + }, + { + "name": "Preview Docs", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/venv/bin/great-docs", + "args": ["preview"], + "console": "integratedTerminal", + "python": "${workspaceFolder}/venv/bin/python", + "cwd": "${workspaceFolder}" + }, + { + "name": "Preview Docs (subpath)", + "type": "debugpy", + "request": "launch", + "program": "${workspaceFolder}/scripts/serve_docs.py", + "console": "integratedTerminal", + "python": "${workspaceFolder}/venv/bin/python", + "cwd": "${workspaceFolder}" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..1e0791b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build Docs", + "type": "shell", + "command": "${workspaceFolder}/venv/bin/python", + "args": ["${workspaceFolder}/scripts/build_docs.py"], + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + } + ] +} diff --git a/README.md b/README.md index 996ea0a..477b7b0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # switchlang -[![](https://img.shields.io/badge/python-3.6+-blue.svg)](https://www.python.org/downloads/) -[![](https://img.shields.io/pypi/l/markdown-subtemplate.svg)](https://github.com/mikeckennedy/python-switch/blob/master/LICENSE) +[![](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) +[![](https://img.shields.io/pypi/l/switchlang.svg)](https://github.com/mikeckennedy/python-switch/blob/master/LICENSE) [![](https://img.shields.io/pypi/dm/switchlang.svg)](https://pypi.org/project/switchlang/) @@ -51,7 +51,7 @@ pip install switchlang * Supports default case * Checks for duplicate keys / cases * Keys can be anything hashable (numbers, strings, objects, etc.) -* Could be extended for "fall-through" cases (doesn't yet) +* Supports "fall-through" cases (opt-in with `fallthrough=True`) * Use range and list for multiple cases mapped to a single action ## Multiple cases, one action @@ -158,7 +158,7 @@ It seems to convey the intent of switch way more than the dict. But either are o ## Why not just `if / elif / else`? -The another push back on this idea is that we already have this problem solved. +Another push back on this idea is that we already have this problem solved. Switch statements are really if / elif / else blocks. So you write the following code. ```python @@ -193,7 +193,7 @@ But there are still things that are harder. * How would you deal with fall-through cleanly? * Did you notice the bug? We forgot to set result in default case (`else`) and will result in a runtime error (but only if that case hits). -* There is another bug. Update `update_availability` will never run because it's command (`a`) is bound to two cases. +* There is another bug. `update_availability` will never run because its command (`a`) is bound to two cases. This is guarded against in switch and you would receive a duplicate case error the first time it runs at all. * While it's pretty clear, it's much more verbose and less declarative than the switch version. diff --git a/docs/.well-known/agent-skills/index.json b/docs/.well-known/agent-skills/index.json new file mode 100644 index 0000000..7b1de61 --- /dev/null +++ b/docs/.well-known/agent-skills/index.json @@ -0,0 +1,11 @@ +{ + "skills": [ + { + "name": "switchlang", + "description": "Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package.", + "files": [ + "SKILL.md" + ] + } + ] +} diff --git a/docs/.well-known/agent-skills/switchlang/SKILL.md b/docs/.well-known/agent-skills/switchlang/SKILL.md new file mode 100644 index 0000000..194f161 --- /dev/null +++ b/docs/.well-known/agent-skills/switchlang/SKILL.md @@ -0,0 +1,40 @@ +--- +name: switchlang +description: > + Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package. +license: MIT +compatibility: Requires Python >=3.9. +--- + +# switchlang + +Adds switch blocks to the Python language. + +## Installation + +```bash +pip install switchlang +``` + +## API overview + +### The switch block + +The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. + + +- `switch`: switch is a module-level implementation of the switch statement for Python + +### Range helpers + +Helpers for mapping ranges of values to a single case. + + +- `closed_range`: Creates a closed range that allows you to specify a case + +## Resources + +- [Full documentation](https://mkennedy.codes/docs/python-switch/) +- [llms.txt](llms.txt) β€” Indexed API reference for LLMs +- [llms-full.txt](llms-full.txt) β€” Comprehensive documentation for LLMs +- [Source code](https://github.com/mikeckennedy/python-switch) diff --git a/docs/.well-known/skills/default/SKILL.md b/docs/.well-known/skills/default/SKILL.md new file mode 100644 index 0000000..194f161 --- /dev/null +++ b/docs/.well-known/skills/default/SKILL.md @@ -0,0 +1,40 @@ +--- +name: switchlang +description: > + Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package. +license: MIT +compatibility: Requires Python >=3.9. +--- + +# switchlang + +Adds switch blocks to the Python language. + +## Installation + +```bash +pip install switchlang +``` + +## API overview + +### The switch block + +The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. + + +- `switch`: switch is a module-level implementation of the switch statement for Python + +### Range helpers + +Helpers for mapping ranges of values to a single case. + + +- `closed_range`: Creates a closed range that allows you to specify a case + +## Resources + +- [Full documentation](https://mkennedy.codes/docs/python-switch/) +- [llms.txt](llms.txt) β€” Indexed API reference for LLMs +- [llms-full.txt](llms-full.txt) β€” Comprehensive documentation for LLMs +- [Source code](https://github.com/mikeckennedy/python-switch) diff --git a/docs/JetBrainsMono-Bold.subset.woff2 b/docs/JetBrainsMono-Bold.subset.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..aa9ad55a80b7042fbb9db31284357eaa413c41f1 GIT binary patch literal 25484 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 T?7VX{Iz)T%-jxRx5C8xG(-?HQ literal 0 HcmV?d00001 diff --git a/docs/JetBrainsMono-Regular.subset.woff2 b/docs/JetBrainsMono-Regular.subset.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..901b8bbefad322fa7d71b79dc2650da131c89024 GIT binary patch literal 24736 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 literal 0 HcmV?d00001 diff --git a/docs/back-to-top.js b/docs/back-to-top.js new file mode 100644 index 0000000..0d938c7 --- /dev/null +++ b/docs/back-to-top.js @@ -0,0 +1,122 @@ +/** + * Back-to-Top Button for Great Docs + * + * Features: + * - Floating button that appears after scrolling down + * - Smooth scroll animation to page top + * - Respects reduced-motion preferences + * - Positioned to avoid collision with prev/next page navigation + * - Dark mode aware + * - Keyboard accessible + */ + +(function() { + 'use strict'; + + // How far (in pixels) the user must scroll before the button appears + var SCROLL_THRESHOLD = 300; + + /** + * Check if the user prefers reduced motion + */ + function prefersReducedMotion() { + return window.matchMedia('(prefers-reduced-motion: reduce)').matches; + } + + /** + * Create the back-to-top button element + */ + function createButton() { + var btn = document.createElement('button'); + btn.className = 'gd-back-to-top'; + btn.setAttribute('aria-label', 'Back to top'); + btn.setAttribute('title', 'Back to top'); + btn.setAttribute('type', 'button'); + + // Chevron-up SVG icon (Lucide-style, 24Γ—24) + btn.innerHTML = + ''; + + return btn; + } + + /** + * Scroll to the top of the page + */ + function scrollToTop() { + if (prefersReducedMotion()) { + // Instant scroll for reduced-motion preference + window.scrollTo(0, 0); + } else { + window.scrollTo({ top: 0, behavior: 'smooth' }); + } + } + + /** + * Update button visibility based on scroll position + */ + function updateVisibility(btn) { + if (window.scrollY > SCROLL_THRESHOLD) { + btn.classList.add('gd-back-to-top-visible'); + } else { + btn.classList.remove('gd-back-to-top-visible'); + } + } + + /** + * Check if prev/next page navigation is near the viewport bottom + * and adjust button position to avoid overlap + */ + function adjustForPageNav(btn) { + var pageNav = document.querySelector('.page-navigation'); + if (!pageNav) return; + + var navRect = pageNav.getBoundingClientRect(); + var viewportHeight = window.innerHeight; + + // If the page nav is visible in the viewport, shift the button up + if (navRect.top < viewportHeight && navRect.bottom > 0) { + var overlap = viewportHeight - navRect.top + 16; // 16px extra gap + btn.style.bottom = Math.max(overlap, 32) + 'px'; + } else { + btn.style.bottom = ''; + } + } + + /** + * Initialize the back-to-top button + */ + function init() { + var btn = createButton(); + document.body.appendChild(btn); + + btn.addEventListener('click', scrollToTop); + + // Throttle scroll handler for performance + var ticking = false; + window.addEventListener('scroll', function() { + if (!ticking) { + window.requestAnimationFrame(function() { + updateVisibility(btn); + adjustForPageNav(btn); + ticking = false; + }); + ticking = true; + } + }, { passive: true }); + + // Initial state + updateVisibility(btn); + } + + // DOM ready check + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); diff --git a/docs/changelog.html b/docs/changelog.html new file mode 100644 index 0000000..e971c21 --- /dev/null +++ b/docs/changelog.html @@ -0,0 +1,543 @@ + + + + + + + + + +Changelog – switchlang | switchlang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+ +
+
+

Changelog

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

This changelog is generated automatically from GitHub Releases.

+
+

v0.1.1

+

2025-09-11 Β· GitHub

+

Refactor codebase for consistent double‑quoted strings and add type hints

+

This update replaces single‑quoted literals with double quotes throughout the repository, standardizes string formatting in setup.py, __init__.py, and test files, and introduces comprehensive type annotations to improve readability and static analysis support. The changes also clean up import statements, adjust exception messages for clarity, and ensure the package metadata uses consistent quoting conventions. πŸš€

+

Solves potential type warning on s.result.

+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..30f4fd5 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,14 @@ +# Changelog + +This changelog is generated automatically from [GitHub Releases](https://github.com/mikeckennedy/python-switch/releases). + + +# v0.1.1 + +*2025-09-11* Β· [GitHub](https://github.com/mikeckennedy/python-switch/releases/tag/v0.1.1) + +Refactor codebase for consistent double‑quoted strings and add type hints + +This update replaces single‑quoted literals with double quotes throughout the repository, standardizes string formatting in `setup.py`, `__init__.py`, and test files, and introduces comprehensive type annotations to improve readability and static analysis support. The changes also clean up import statements, adjust exception messages for clarity, and ensure the package metadata uses consistent quoting conventions. πŸš€ + +Solves potential type warning on `s.result`. diff --git a/docs/color-swatch.js b/docs/color-swatch.js new file mode 100644 index 0000000..a035643 --- /dev/null +++ b/docs/color-swatch.js @@ -0,0 +1,186 @@ +/** + * Color Swatch Extension for Great Docs + * + * Handles Tippy.js tooltips, click-to-copy with feedback overlay, + * and tooltip copy buttons for the color-swatch shortcode. + */ +(function () { + "use strict"; + + var containers = document.querySelectorAll(".gd-color-swatch"); + if (!containers.length) return; + + // Check icon SVG for copy feedback overlay + var checkSvg = + ''; + + /** + * Copy text to clipboard with fallback for non-HTTPS contexts. + */ + function copyToClipboard(text) { + if (navigator.clipboard && navigator.clipboard.writeText) { + return navigator.clipboard.writeText(text); + } + // Fallback: hidden textarea + execCommand + return new Promise(function (resolve, reject) { + var ta = document.createElement("textarea"); + ta.value = text; + ta.style.position = "fixed"; + ta.style.left = "-9999px"; + ta.style.opacity = "0"; + document.body.appendChild(ta); + ta.select(); + try { + document.execCommand("copy"); + resolve(); + } catch (err) { + reject(err); + } finally { + document.body.removeChild(ta); + } + }); + } + + /** + * Show a brief checkmark overlay on a swatch element after copying. + */ + function showCopyFeedback(el) { + var overlay = document.createElement("div"); + overlay.className = "gd-swatch-copy-overlay"; + overlay.innerHTML = checkSvg; + el.appendChild(overlay); + + // Announce for screen readers + var liveRegion = document.getElementById("gd-cs-live"); + if (liveRegion) { + liveRegion.textContent = "Copied"; + } + + requestAnimationFrame(function () { + overlay.style.opacity = "1"; + setTimeout(function () { + overlay.style.opacity = "0"; + setTimeout(function () { + overlay.remove(); + }, 300); + }, 700); + }); + } + + /** + * Get the hex value to copy from a swatch element. + */ + function getHexFromEl(el) { + return ( + el.getAttribute("data-hex") || + el.querySelector("[data-hex]")?.getAttribute("data-hex") || + "" + ); + } + + /** + * Handle click-to-copy on a swatch. + */ + function handleSwatchClick(e) { + var el = e.currentTarget; + var hex = getHexFromEl(el); + if (!hex) return; + + // Find the color fill element for the overlay + var colorEl = el.classList.contains("gd-swatch-color") + ? el + : el.querySelector(".gd-swatch-color") || el; + + copyToClipboard(hex).then(function () { + showCopyFeedback(colorEl); + }); + } + + /** + * Handle keyboard activation (Enter/Space). + */ + function handleSwatchKeydown(e) { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + handleSwatchClick(e); + } + } + + /** + * Initialize tooltips on elements with data-tooltip-html. + */ + function initTooltips(container) { + if (typeof tippy === "undefined") return; + + var els = container.querySelectorAll("[data-tooltip-html]"); + els.forEach(function (el) { + var content = el.getAttribute("data-tooltip-html"); + if (!content) return; + + tippy(el, { + content: content, + allowHTML: true, + placement: "top", + delay: [150, 100], + interactive: true, + appendTo: document.body, + maxWidth: 320, + onShown: function (instance) { + // Attach copy handlers to tooltip copy buttons + var btns = instance.popper.querySelectorAll(".gd-cs-tooltip-copy"); + btns.forEach(function (btn) { + btn.addEventListener("click", function (e) { + e.stopPropagation(); + var hex = btn.getAttribute("data-hex"); + if (hex) { + copyToClipboard(hex).then(function () { + btn.textContent = "\u2713"; + setTimeout(function () { + btn.innerHTML = "📋"; + }, 1000); + }); + } + }); + }); + }, + }); + }); + } + + /** + * Initialize a single color-swatch container. + */ + function initContainer(container) { + // Circle swatches β€” click on the wrapper (.gd-swatch) + var swatches = container.querySelectorAll(".gd-swatch"); + swatches.forEach(function (el) { + el.addEventListener("click", handleSwatchClick); + el.addEventListener("keydown", handleSwatchKeydown); + }); + + // Rectangle swatches β€” click on the strip (.gd-swatch-rect) + var rects = container.querySelectorAll(".gd-swatch-rect"); + rects.forEach(function (el) { + el.addEventListener("click", handleSwatchClick); + el.addEventListener("keydown", handleSwatchKeydown); + }); + + // Tooltips (attach to color fills and rects) + initTooltips(container); + } + + // Create a live region for screen reader announcements + if (!document.getElementById("gd-cs-live")) { + var live = document.createElement("div"); + live.id = "gd-cs-live"; + live.setAttribute("aria-live", "polite"); + live.setAttribute("aria-atomic", "true"); + live.className = "visually-hidden"; + document.body.appendChild(live); + } + + // Initialize all containers + containers.forEach(initContainer); +})(); diff --git a/docs/copy-code.js b/docs/copy-code.js new file mode 100644 index 0000000..d8c68fb --- /dev/null +++ b/docs/copy-code.js @@ -0,0 +1,176 @@ +/** + * Custom copy-code button for Great Docs + * + * Replaces Quarto's default code-copy with a consistent top-right button + * that floats properly and works in both light and dark modes. + * + * Handles: + * - Buttons injected by post-render.py (.gd-code-copy inside .gd-code-nav) + * - Quarto-native code blocks (pre.code-with-copy) that lack a custom button + */ +(function () { + "use strict"; + + // i18n helper β€” read translations from + var _i18nCache = null; + function _gdT(key, fallback) { + if (!_i18nCache) { + try { + var meta = document.querySelector('meta[name="gd-i18n"]'); + _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {}; + } catch (e) { _i18nCache = {}; } + } + return _i18nCache[key] || fallback; + } + + // Inline SVG icons β€” no external dependency + var COPY_ICON = + '' + + '' + + '' + + ""; + + var CHECK_ICON = + '' + + '' + + ""; + + /** + * Walk up from the button to find the element whose text to copy. + */ + function getCodeText(button) { + var scaffold = button.closest(".code-copy-outer-scaffold"); + if (scaffold) { + var code = scaffold.querySelector("pre > code"); + if (code) return code.textContent; + } + // Fallback: walk up to the nav, then find sibling pre > code + var nav = button.closest(".gd-code-nav"); + if (nav) { + var container = nav.parentElement; + if (container) { + var code = container.querySelector("pre > code"); + if (code) return code.textContent; + } + } + return ""; + } + + /** + * Copy handler with visual feedback. + */ + function handleCopy(event) { + var button = event.currentTarget; + var text = getCodeText(button); + if (!text) return; + + navigator.clipboard.writeText(text).then(function () { + button.innerHTML = CHECK_ICON; + button.classList.add("gd-code-copied"); + button.setAttribute("title", _gdT("copied", "Copied!")); + + setTimeout(function () { + button.innerHTML = COPY_ICON; + button.classList.remove("gd-code-copied"); + button.setAttribute("title", _gdT("copy_to_clipboard", "Copy to clipboard")); + }, 2000); + }); + } + + /** + * Create a gd-code-nav + gd-code-copy button element. + */ + function createCopyButton() { + var nav = document.createElement("nav"); + nav.className = "gd-code-nav"; + var btn = document.createElement("button"); + btn.className = "gd-code-copy"; + btn.title = _gdT("copy_to_clipboard", "Copy to clipboard"); + btn.innerHTML = COPY_ICON; + btn.addEventListener("click", handleCopy); + nav.appendChild(btn); + return nav; + } + + /** + * Replace any leftover Quarto-native .code-copy-button with our component. + */ + function replaceQuartoButtons() { + document + .querySelectorAll("button.code-copy-button") + .forEach(function (oldBtn) { + var nav = createCopyButton(); + + // The Quarto button lives inside a wrapper div; insert the nav there + var parent = oldBtn.parentElement; + if (parent) { + parent.insertBefore(nav, oldBtn); + parent.removeChild(oldBtn); + // Ensure the wrapper acts as a positioning anchor + parent.style.position = "relative"; + } + }); + } + + /** + * Inject a copy button into any code block that doesn't already have one. + * Targets
wrappers and Quarto
 blocks.
+   */
+  function injectMissingButtons() {
+    // Find all 
that aren't inside a scaffold + document.querySelectorAll("div.sourceCode").forEach(function (div) { + // Skip if already inside a scaffold with a button + if (div.closest(".code-copy-outer-scaffold")) return; + // Skip if already has a gd-code-nav + if (div.querySelector(".gd-code-nav")) return; + + var code = div.querySelector("pre > code"); + if (!code) return; + + div.style.position = "relative"; + div.prepend(createCopyButton()); + }); + + // Also catch standalone
 not inside a div.sourceCode
+    document.querySelectorAll("pre.sourceCode").forEach(function (pre) {
+      var parent = pre.parentElement;
+      // Skip if already handled
+      if (parent && parent.classList.contains("sourceCode")) return;
+      if (parent && parent.querySelector(".gd-code-nav")) return;
+      if (pre.closest(".code-copy-outer-scaffold")) return;
+
+      var code = pre.querySelector("code");
+      if (!code) return;
+
+      // Wrap in a relative container
+      if (parent) {
+        parent.style.position = "relative";
+        parent.insertBefore(createCopyButton(), pre);
+      }
+    });
+  }
+
+  function init() {
+    // 1. Wire up buttons that post-render.py already injected
+    document.querySelectorAll(".gd-code-copy").forEach(function (btn) {
+      btn.innerHTML = COPY_ICON;
+      btn.addEventListener("click", handleCopy);
+    });
+
+    // 2. Convert any remaining Quarto-native copy buttons
+    replaceQuartoButtons();
+
+    // 3. Inject buttons into code blocks that have none
+    injectMissingButtons();
+  }
+
+  if (document.readyState === "loading") {
+    document.addEventListener("DOMContentLoaded", init);
+  } else {
+    init();
+  }
+})();
diff --git a/docs/copy-page.js b/docs/copy-page.js
new file mode 100644
index 0000000..8120cda
--- /dev/null
+++ b/docs/copy-page.js
@@ -0,0 +1,149 @@
+/**
+ * Copy Page Widget for Great Docs
+ *
+ * Provides two actions:
+ * - "Copy as Markdown" β€” copies the page's .md content to clipboard
+ * - "View as Markdown" β€” navigates to the .md version of the page
+ *
+ * The .md files are generated alongside .html files by the post-render script.
+ */
+
+(function() {
+    'use strict';
+
+    /**
+     * Look up a translated string from the gd-i18n meta tag.
+     */
+    var _i18nCache = null;
+    function _gdT(key, fallback) {
+        if (!_i18nCache) {
+            try {
+                var meta = document.querySelector('meta[name="gd-i18n"]');
+                _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {};
+            } catch (e) { _i18nCache = {}; }
+        }
+        return _i18nCache[key] || fallback;
+    }
+
+    /**
+     * Derive the .md URL from the current page URL.
+     * e.g., /reference/GreatDocs.html -> /reference/GreatDocs.md
+     *       /user-guide/quickstart.html -> /user-guide/quickstart.md
+     */
+    function getMdUrl() {
+        var path = window.location.pathname;
+        // Replace .html with .md
+        if (path.endsWith('.html')) {
+            return path.slice(0, -5) + '.md';
+        }
+        // For paths ending in / (index pages), try index.md
+        if (path.endsWith('/')) {
+            return path + 'index.md';
+        }
+        return path + '.md';
+    }
+
+    /**
+     * Create and inject the copy-page widget.
+     */
+    function initCopyPage() {
+        // Find the title block header to position the button
+        var titleBlock = document.getElementById('title-block-header');
+        if (!titleBlock) return;
+
+        // Skip the Skills page (has its own layout)
+        if (document.querySelector('.gd-skills-install')) return;
+
+        // Skip the License page (has its own layout)
+        if (document.body.classList.contains('gd-license-page')) return;
+
+        // Skip the Tags index page
+        if (document.body.classList.contains('gd-tags-index')) return;
+
+        // Skip the Blog index page
+        if (document.body.classList.contains('gd-blog-index')) return;
+
+        // Create the widget container
+        var widget = document.createElement('div');
+        widget.className = 'gd-copy-page';
+        widget.setAttribute('role', 'group');
+        widget.setAttribute('aria-label', _gdT('page_actions', 'Page actions'));
+
+        // Copy as Markdown button
+        var copyBtn = document.createElement('button');
+        copyBtn.className = 'gd-copy-page-btn gd-copy-md-btn';
+        copyBtn.setAttribute('title', _gdT('copy_page_as_markdown', 'Copy page as Markdown'));
+        copyBtn.setAttribute('aria-label', _gdT('copy_page_as_markdown', 'Copy page as Markdown'));
+        copyBtn.innerHTML =
+            '' +
+            '' + _gdT('copy_page', 'Copy page') + '';
+
+        // View as Markdown link
+        var viewLink = document.createElement('a');
+        viewLink.className = 'gd-copy-page-btn gd-view-md-btn';
+        viewLink.href = getMdUrl();
+        viewLink.setAttribute('title', _gdT('view_as_markdown', 'View as Markdown'));
+        viewLink.setAttribute('aria-label', _gdT('view_page_as_markdown', 'View page as Markdown'));
+        viewLink.innerHTML =
+            '';
+
+        widget.appendChild(copyBtn);
+        widget.appendChild(viewLink);
+
+        // Insert before the title block
+        titleBlock.parentNode.insertBefore(widget, titleBlock);
+
+        // Pre-fetch the .md content so the clipboard write can happen
+        // synchronously inside the click handler (preserving user activation).
+        var mdUrl = getMdUrl();
+        var cachedMd = null;
+
+        fetch(mdUrl)
+            .then(function(response) {
+                if (!response.ok) throw new Error('not found');
+                return response.text();
+            })
+            .then(function(text) { cachedMd = text; })
+            .catch(function() { /* will show error on click */ });
+
+        // Copy handler β€” writes from cache so clipboard API gets user activation
+        copyBtn.addEventListener('click', function() {
+            var label = copyBtn.querySelector('.gd-copy-page-label');
+            var origText = label.textContent;
+
+            if (!cachedMd) {
+                    label.textContent = _gdT('error', 'Error');
+                setTimeout(function() { label.textContent = origText; }, 2000);
+                return;
+            }
+
+            navigator.clipboard.writeText(cachedMd)
+                .then(function() {
+                    label.textContent = _gdT('copied', 'Copied!');
+                    copyBtn.classList.add('gd-copy-success');
+                    setTimeout(function() {
+                        label.textContent = origText;
+                        copyBtn.classList.remove('gd-copy-success');
+                    }, 2000);
+                })
+                .catch(function(err) {
+                    console.warn('Copy page failed:', err);
+                    label.textContent = _gdT('error', 'Error');
+                    setTimeout(function() { label.textContent = origText; }, 2000);
+                });
+        });
+    }
+
+    // Initialize when DOM is ready
+    if (document.readyState === 'loading') {
+        document.addEventListener('DOMContentLoaded', initCopyPage);
+    } else {
+        initCopyPage();
+    }
+})();
diff --git a/docs/dark-mode-toggle.js b/docs/dark-mode-toggle.js
new file mode 100644
index 0000000..62ede84
--- /dev/null
+++ b/docs/dark-mode-toggle.js
@@ -0,0 +1,321 @@
+/**
+ * Dark Mode Toggle for Great Docs
+ *
+ * Features:
+ * - Toggle switch in the navbar
+ * - System preference detection
+ * - Persistent preference storage
+ * - Smooth transitions
+ */
+
+(function() {
+    'use strict';
+
+    // i18n helper β€” read translations from 
+    var _i18nCache = null;
+    function _gdT(key, fallback) {
+        if (!_i18nCache) {
+            try {
+                var meta = document.querySelector('meta[name="gd-i18n"]');
+                _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {};
+            } catch (e) { _i18nCache = {}; }
+        }
+        return _i18nCache[key] || fallback;
+    }
+
+    const STORAGE_KEY = 'great-docs-theme';
+    const DARK_CLASS = 'quarto-dark';
+    const LIGHT_CLASS = 'quarto-light';
+
+    /**
+     * Get the user's system color scheme preference
+     */
+    function getSystemPreference() {
+        if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+            return 'dark';
+        }
+        return 'light';
+    }
+
+    /**
+     * Get the stored theme preference
+     */
+    function getStoredPreference() {
+        try {
+            return localStorage.getItem(STORAGE_KEY);
+        } catch (e) {
+            return null;
+        }
+    }
+
+    /**
+     * Store the theme preference
+     */
+    function setStoredPreference(theme) {
+        try {
+            localStorage.setItem(STORAGE_KEY, theme);
+        } catch (e) {
+            // localStorage not available
+        }
+    }
+
+    /**
+     * Get the current effective theme
+     */
+    function getCurrentTheme() {
+        const stored = getStoredPreference();
+        if (stored === 'dark' || stored === 'light') {
+            return stored;
+        }
+        return getSystemPreference();
+    }
+
+    /**
+     * Apply the theme to the document
+     */
+    function applyTheme(theme) {
+        const html = document.documentElement;
+        const body = document.body;
+
+        if (theme === 'dark') {
+            html.classList.add(DARK_CLASS);
+            html.classList.remove(LIGHT_CLASS);
+            body.classList.add(DARK_CLASS);
+            body.classList.remove(LIGHT_CLASS);
+            html.setAttribute('data-bs-theme', 'dark');
+        } else {
+            html.classList.add(LIGHT_CLASS);
+            html.classList.remove(DARK_CLASS);
+            body.classList.add(LIGHT_CLASS);
+            body.classList.remove(DARK_CLASS);
+            html.setAttribute('data-bs-theme', 'light');
+        }
+
+        // Update toggle button state
+        updateToggleButton(theme);
+    }
+
+    /**
+     * Update the toggle button appearance
+     */
+    function updateToggleButton(theme) {
+        const toggle = document.getElementById('dark-mode-toggle');
+        if (!toggle) return;
+
+        const sunIcon = toggle.querySelector('.theme-icon-light');
+        const moonIcon = toggle.querySelector('.theme-icon-dark');
+        const newTooltip = theme === 'dark'
+            ? _gdT('switch_to_light_mode', 'Switch to light mode')
+            : _gdT('switch_to_dark_mode', 'Switch to dark mode');
+
+        if (theme === 'dark') {
+            toggle.setAttribute('aria-pressed', 'true');
+            if (sunIcon) sunIcon.style.display = 'none';
+            if (moonIcon) moonIcon.style.display = 'inline-block';
+        } else {
+            toggle.setAttribute('aria-pressed', 'false');
+            if (sunIcon) sunIcon.style.display = 'inline-block';
+            if (moonIcon) moonIcon.style.display = 'none';
+        }
+
+        // Update tooltip: use data-tippy-content to keep Tippy in sync
+        // and avoid native browser tooltips (which appear after delay)
+        toggle.setAttribute('data-tippy-content', newTooltip);
+        toggle.removeAttribute('title');
+
+        // Update existing Tippy instance content directly if present
+        if (toggle._tippy) {
+            toggle._tippy.setContent(newTooltip);
+        }
+    }
+
+    /**
+     * Toggle between light and dark themes
+     */
+    function toggleTheme() {
+        const current = getCurrentTheme();
+        const newTheme = current === 'dark' ? 'light' : 'dark';
+        setStoredPreference(newTheme);
+        applyTheme(newTheme);
+    }
+
+    /**
+     * Create the toggle button HTML
+     */
+    function createToggleButton() {
+        const container = document.createElement('div');
+        container.id = 'dark-mode-toggle-container';
+        container.innerHTML = `
+            
+        `;
+        return container;
+    }
+
+    /**
+     * Insert the toggle button into the navbar
+     */
+    function insertToggleButton() {
+        // Insert into navbarCollapse; navbar-widgets.js will collect it
+        // into the unified #gd-navbar-widgets container.
+        const collapse = document.getElementById('navbarCollapse');
+        if (!collapse) return;
+
+        const toggleContainer = createToggleButton();
+        const navItem = document.createElement('li');
+        navItem.className = 'nav-item';
+        navItem.appendChild(toggleContainer);
+
+        // Append to navbarCollapse (the collector will move it)
+        var msAuto = collapse.querySelector('.navbar-nav.ms-auto');
+        if (msAuto) {
+            msAuto.insertBefore(navItem, msAuto.firstChild);
+        } else {
+            collapse.appendChild(navItem);
+        }
+
+        // Add click handler
+        const toggle = document.getElementById('dark-mode-toggle');
+        if (toggle) {
+            toggle.addEventListener('click', toggleTheme);
+        }
+    }
+
+    /**
+     * Listen for system preference changes
+     */
+    function setupSystemPreferenceListener() {
+        if (!window.matchMedia) return;
+
+        const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+
+        mediaQuery.addEventListener('change', (e) => {
+            // Only respond to system changes if user hasn't set a preference
+            const stored = getStoredPreference();
+            if (!stored) {
+                applyTheme(e.matches ? 'dark' : 'light');
+            }
+        });
+    }
+
+    /**
+     * Apply theme immediately to prevent flash
+     */
+    function applyInitialTheme() {
+        const theme = getCurrentTheme();
+
+        // Apply to html element immediately (before body is available)
+        const html = document.documentElement;
+        if (theme === 'dark') {
+            html.classList.add(DARK_CLASS);
+            html.classList.remove(LIGHT_CLASS);
+            html.setAttribute('data-bs-theme', 'dark');
+        } else {
+            html.classList.add(LIGHT_CLASS);
+            html.classList.remove(DARK_CLASS);
+            html.setAttribute('data-bs-theme', 'light');
+        }
+    }
+
+    /**
+     * Fix the navbar dark-logo src from a  tag.
+     * Quarto's logo-dark config is ignored without a paired dark theme,
+     * so both .light-content and .dark-content imgs point to the same file.
+     * We read the correct dark logo path from 
+     * and patch the src at runtime.
+     */
+    function fixNavbarDarkLogo() {
+        var meta = document.querySelector('meta[name="gd-logo-dark"]');
+        if (!meta) return;
+        var darkFilename = meta.getAttribute('content');
+        if (!darkFilename) return;
+
+        // Resolve the dark logo path relative to the light logo's directory,
+        // so sub-pages (e.g. user-guide/page.html) get the correct "../" prefix.
+        var lightImg = document.querySelector('.navbar-logo.light-content');
+        var darkSrc = darkFilename;
+        if (lightImg && lightImg.getAttribute('src')) {
+            var lightSrc = lightImg.getAttribute('src');
+            var lastSlash = lightSrc.lastIndexOf('/');
+            if (lastSlash >= 0) {
+                darkSrc = lightSrc.substring(0, lastSlash + 1) + darkFilename;
+            }
+        }
+
+        document.querySelectorAll('.navbar-logo.dark-content').forEach(function(img) {
+            img.src = darkSrc;
+        });
+    }
+
+    /**
+     * Initialize dark mode functionality
+     */
+    function init() {
+        // Fix navbar dark logo src before applying theme
+        fixNavbarDarkLogo();
+
+        // Apply theme to body now that DOM is ready
+        const theme = getCurrentTheme();
+        applyTheme(theme);
+
+        // Insert toggle button
+        insertToggleButton();
+
+        // Update toggle button to reflect current theme (must be after insertion)
+        updateToggleButton(theme);
+
+        // Setup system preference listener
+        setupSystemPreferenceListener();
+    }
+
+    // Apply initial theme immediately to prevent flash of wrong theme
+    applyInitialTheme();
+
+    // Initialize when DOM is ready
+    if (document.readyState === 'loading') {
+        document.addEventListener('DOMContentLoaded', init);
+    } else {
+        init();
+    }
+
+    // Expose API for external use
+    window.greatDocsDarkMode = {
+        toggle: toggleTheme,
+        setTheme: function(theme) {
+            if (theme === 'dark' || theme === 'light') {
+                setStoredPreference(theme);
+                applyTheme(theme);
+            }
+        },
+        getTheme: getCurrentTheme,
+        clearPreference: function() {
+            try {
+                localStorage.removeItem(STORAGE_KEY);
+            } catch (e) {}
+            applyTheme(getSystemPreference());
+        }
+    };
+})();
diff --git a/docs/details.js b/docs/details.js
new file mode 100644
index 0000000..6e109e3
--- /dev/null
+++ b/docs/details.js
@@ -0,0 +1,198 @@
+/**
+ * Great Docs β€” Collapsible Details
+ *
+ * Provides smooth expand/collapse animation and accordion-group behavior
+ * for 
elements produced by the {{< details >}} + * shortcode. + * + * Features: + * - Smooth height animation on toggle (respects prefers-reduced-motion) + * - Accordion groups: elements sharing the same data-gd-group attribute + * close siblings when one opens + * - Works with nested details elements + */ +(function () { + "use strict"; + + // ── Feature detection ────────────────────────────────────────────── + var reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)"); + + // ── Animation helpers ────────────────────────────────────────────── + + /** + * Animate the opening of a
element. + * @param {HTMLDetailsElement} el + */ + function animateOpen(el) { + var body = el.querySelector(".gd-details-body"); + if (!body) return; + + // Force the element open so we can measure the target height + el.open = true; + + // Measure current (collapsed) and target (expanded) heights + var summary = el.querySelector("summary"); + var startHeight = summary ? summary.offsetHeight : 0; + var endHeight = el.scrollHeight; + + // If reduced motion is preferred, skip animation + if (reducedMotion.matches) { + el.style.height = ""; + el.style.overflow = ""; + el.classList.add("gd-details--open"); + return; + } + + el.style.height = startHeight + "px"; + el.style.overflow = "hidden"; + + // Force reflow + void el.offsetHeight; + + el.classList.add("gd-details--animating"); + el.style.height = endHeight + "px"; + + function onEnd() { + el.removeEventListener("transitionend", onEnd); + el.classList.remove("gd-details--animating"); + el.classList.add("gd-details--open"); + el.style.height = ""; + el.style.overflow = ""; + } + el.addEventListener("transitionend", onEnd); + } + + /** + * Animate the closing of a
element. + * @param {HTMLDetailsElement} el + */ + function animateClose(el) { + var body = el.querySelector(".gd-details-body"); + if (!body) return; + + // If reduced motion is preferred, just close immediately + if (reducedMotion.matches) { + el.classList.remove("gd-details--open"); + el.open = false; + return; + } + + var startHeight = el.scrollHeight; + var summary = el.querySelector("summary"); + var endHeight = summary ? summary.offsetHeight : 0; + + el.style.height = startHeight + "px"; + el.style.overflow = "hidden"; + + // Force reflow + void el.offsetHeight; + + el.classList.add("gd-details--animating"); + el.classList.remove("gd-details--open"); + el.style.height = endHeight + "px"; + + function onEnd() { + el.removeEventListener("transitionend", onEnd); + el.classList.remove("gd-details--animating"); + el.open = false; + el.style.height = ""; + el.style.overflow = ""; + } + el.addEventListener("transitionend", onEnd); + } + + // ── Accordion logic ──────────────────────────────────────────────── + + /** + * Close all other details in the same accordion group. + * @param {HTMLDetailsElement} current - The details element being opened + * @param {string} group - The accordion group name + */ + function closeGroupSiblings(current, group) { + var siblings = document.querySelectorAll( + 'details.gd-details[data-gd-group="' + group + '"]' + ); + for (var i = 0; i < siblings.length; i++) { + if (siblings[i] !== current && siblings[i].open) { + animateClose(siblings[i]); + } + } + } + + // ── Event binding ────────────────────────────────────────────────── + + /** + * Attach click handlers to all .gd-details elements. + */ + function initDetails() { + var elements = document.querySelectorAll("details.gd-details"); + + for (var i = 0; i < elements.length; i++) { + (function (el) { + // Mark initially-open elements + if (el.open) { + el.classList.add("gd-details--open"); + } + + var summary = el.querySelector("summary"); + if (!summary) return; + + summary.addEventListener("click", function (e) { + e.preventDefault(); + + if (el.open) { + // Currently open β†’ close it + animateClose(el); + } else { + // Currently closed β†’ open it + var group = el.getAttribute("data-gd-group"); + if (group) { + closeGroupSiblings(el, group); + } + animateOpen(el); + } + }); + })(elements[i]); + } + } + + // ── Gleam animation (JS-driven) ───────────────────────────────────── + + /** + * Animate the --gd-gleam-angle custom property via requestAnimationFrame. + * This avoids reliance on @property (inconsistent cross-browser). + */ + function initGleam() { + var gleamEls = document.querySelectorAll(".gd-details--gleam"); + if (!gleamEls.length) return; + if (reducedMotion.matches) return; + + var duration = 6000; // ms for a full 360Β° sweep + var start = null; + + function tick(timestamp) { + if (!start) start = timestamp; + var elapsed = (timestamp - start) % duration; + var angle = (elapsed / duration) * 360; + var value = angle + "deg"; + + for (var i = 0; i < gleamEls.length; i++) { + gleamEls[i].style.setProperty("--gd-gleam-angle", value); + } + requestAnimationFrame(tick); + } + + requestAnimationFrame(tick); + } + + // ── Initialize ───────────────────────────────────────────────────── + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", function () { + initDetails(); + initGleam(); + }); + } else { + initDetails(); + initGleam(); + } +})(); diff --git a/docs/github-widget.js b/docs/github-widget.js new file mode 100644 index 0000000..0cf1c0f --- /dev/null +++ b/docs/github-widget.js @@ -0,0 +1,313 @@ +/** + * GitHub Widget for Great-Docs + * + * A souped-up GitHub icon link with: + * - Live star and fork counts + * - Dropdown menu linking to repo, issues, PRs + * - Caching to avoid API rate limits + */ + +(function() { + 'use strict'; + + // Configuration - will be set by data attributes + let config = { + owner: null, + repo: null, + cacheKey: 'great-docs-github-stats', + cacheDuration: 5 * 60 * 1000 // 5 minutes + }; + + /** + * Initialize the GitHub widget + */ + function initGitHubWidget() { + const widget = document.getElementById('github-widget'); + if (!widget) return; + + config.owner = widget.dataset.owner; + config.repo = widget.dataset.repo; + + if (!config.owner || !config.repo) { + console.warn('GitHub widget: Missing owner or repo data attributes'); + return; + } + + // Create the widget structure + createWidgetStructure(widget); + + // Fetch and display stats + fetchGitHubStats(); + + // Setup dropdown behavior + setupDropdown(widget); + } + + /** + * Create the HTML structure for the widget + */ + function createWidgetStructure(container) { + const repoUrl = `https://github.com/${config.owner}/${config.repo}`; + + container.innerHTML = ` + + + `; + } + + /** + * Fetch GitHub stats from API with caching + */ + async function fetchGitHubStats() { + const cacheKey = `${config.cacheKey}-${config.owner}-${config.repo}`; + + // Check cache first + const cached = getFromCache(cacheKey); + if (cached) { + updateStatsDisplay(cached); + return; + } + + try { + // Fetch repo stats + const repoResponse = await fetch( + `https://api.github.com/repos/${config.owner}/${config.repo}`, + { headers: { 'Accept': 'application/vnd.github.v3+json' } } + ); + + if (!repoResponse.ok) { + throw new Error(`GitHub API error: ${repoResponse.status}`); + } + + const repoData = await repoResponse.json(); + + const stats = { + stars: repoData.stargazers_count, + forks: repoData.forks_count, + openIssues: repoData.open_issues_count, // This includes PRs + timestamp: Date.now() + }; + + // Try to get separate issue and PR counts (optional, may hit rate limits) + try { + const [issuesResponse, prsResponse] = await Promise.all([ + fetch(`https://api.github.com/search/issues?q=repo:${config.owner}/${config.repo}+type:issue+state:open`, { + headers: { 'Accept': 'application/vnd.github.v3+json' } + }), + fetch(`https://api.github.com/search/issues?q=repo:${config.owner}/${config.repo}+type:pr+state:open`, { + headers: { 'Accept': 'application/vnd.github.v3+json' } + }) + ]); + + if (issuesResponse.ok && prsResponse.ok) { + const issuesData = await issuesResponse.json(); + const prsData = await prsResponse.json(); + stats.issues = issuesData.total_count; + stats.prs = prsData.total_count; + } + } catch (e) { + // Silently fail - we'll just not show separate counts + } + + // Cache the results + saveToCache(cacheKey, stats); + + // Update display + updateStatsDisplay(stats); + + } catch (error) { + console.warn('GitHub widget: Failed to fetch stats', error); + // Show fallback + updateStatsDisplay({ stars: '?', forks: '?' }); + } + } + + /** + * Update the display with fetched stats + */ + function updateStatsDisplay(stats) { + const starsEl = document.querySelector('.gh-count[data-stat="stars"]'); + const forksEl = document.querySelector('.gh-count[data-stat="forks"]'); + const issuesBadge = document.querySelector('.gh-issues-count'); + const prsBadge = document.querySelector('.gh-prs-count'); + const starsTotalBadge = document.querySelector('.gh-stars-total'); + const forksTotalBadge = document.querySelector('.gh-forks-total'); + + if (starsEl) starsEl.textContent = formatCount(stats.stars); + if (forksEl) forksEl.textContent = formatCount(stats.forks); + + if (issuesBadge && stats.issues !== undefined) { + issuesBadge.textContent = formatCount(stats.issues); + issuesBadge.style.display = 'inline-flex'; + } + + if (prsBadge && stats.prs !== undefined) { + prsBadge.textContent = formatCount(stats.prs); + prsBadge.style.display = 'inline-flex'; + } + + if (starsTotalBadge && stats.stars !== undefined && stats.stars !== '?') { + starsTotalBadge.textContent = formatCount(stats.stars); + starsTotalBadge.style.display = 'inline-flex'; + } + + if (forksTotalBadge && stats.forks !== undefined && stats.forks !== '?') { + forksTotalBadge.textContent = formatCount(stats.forks); + forksTotalBadge.style.display = 'inline-flex'; + } + } + + /** + * Format large numbers (e.g., 1500 -> 1.5k) + */ + function formatCount(num) { + if (num === undefined || num === null || num === '?') return '?'; + if (num >= 1000000) { + return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M'; + } + if (num >= 1000) { + return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; + } + return num.toString(); + } + + /** + * Get cached data if not expired + */ + function getFromCache(key) { + try { + const data = localStorage.getItem(key); + if (!data) return null; + + const parsed = JSON.parse(data); + if (Date.now() - parsed.timestamp > config.cacheDuration) { + localStorage.removeItem(key); + return null; + } + return parsed; + } catch (e) { + return null; + } + } + + /** + * Save data to cache + */ + function saveToCache(key, data) { + try { + localStorage.setItem(key, JSON.stringify(data)); + } catch (e) { + // Silently fail if localStorage is not available + } + } + + /** + * Setup dropdown toggle behavior + */ + function setupDropdown(widget) { + const trigger = widget.querySelector('.gh-widget-trigger'); + const dropdown = widget.querySelector('.gh-dropdown'); + + if (!trigger || !dropdown) return; + + // Toggle on click + trigger.addEventListener('click', (e) => { + e.stopPropagation(); + const isExpanded = trigger.getAttribute('aria-expanded') === 'true'; + trigger.setAttribute('aria-expanded', !isExpanded); + dropdown.setAttribute('aria-hidden', isExpanded); + widget.classList.toggle('gh-widget-open', !isExpanded); + }); + + // Toggle on Enter/Space key + trigger.addEventListener('keydown', (e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + trigger.click(); + } + }); + + // Close on click outside + document.addEventListener('click', (e) => { + if (!widget.contains(e.target)) { + trigger.setAttribute('aria-expanded', 'false'); + dropdown.setAttribute('aria-hidden', 'true'); + widget.classList.remove('gh-widget-open'); + } + }); + + // Close on Escape key + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + trigger.setAttribute('aria-expanded', 'false'); + dropdown.setAttribute('aria-hidden', 'true'); + widget.classList.remove('gh-widget-open'); + } + }); + } + + // Initialize when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initGitHubWidget); + } else { + initGitHubWidget(); + } +})(); diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..20a4de1 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,776 @@ + + + + + + + + + +switchlang | switchlang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ + + + +
+ + + + + + +
+ +
+

AI / Agents

+

Skills
llms.txt
llms-full.txt

+
+
+

Developers

+
+ +

+Michael Kennedy +

+
+

+Author +

+
+
+
+
+

Community

+

Full license MIT

+
+
+

Meta

+

Requires: Python >=3.9
Provides-Extra: dev

+
+
+

switchlang

+

+

Adds switch blocks to the Python language.

+

This module adds explicit switch functionality to Python without changing the language. It builds upon a standard way to define execution blocks: the with statement.

+
+

Example

+
from switchlang import switch
+
+def main():
+    num = 7
+    val = input("Enter a character, a, b, c or any other: ")
+
+    with switch(val) as s:
+        s.case('a', process_a)
+        s.case('b', lambda: process_with_data(val, num, 'other values still'))
+        s.default(process_any)
+    
+def process_a():
+    print("Found A!")
+    
+def process_any():
+    print("Found Default!")
+    
+def process_with_data(*value):
+    print("Found with data: {}".format(value))
+
+main()
+
+
+

Installation

+

Simply install via pip:

+
pip install switchlang
+
+
+

Features

+
    +
  • More explicit than using dictionaries with functions as values.
  • +
  • Verifies the signatures of the methods
  • +
  • Supports default case
  • +
  • Checks for duplicate keys / cases
  • +
  • Keys can be anything hashable (numbers, strings, objects, etc.)
  • +
  • Supports β€œfall-through” cases (opt-in with fallthrough=True)
  • +
  • Use range and list for multiple cases mapped to a single action
  • +
+
+
+

Multiple cases, one action

+

You can map ranges and lists of cases to a single action as follows:

+
## with lists:
+value = 4  # matches even number case
+
+with switch(value) as s:
+    s.case([1, 3, 5, 7], lambda: ...)
+    s.case([0, 2, 4, 6, 8], lambda: ...)
+    s.default(lambda: ...)
+
## with ranges:
+value = 4  # matches first case
+
+with switch(value) as s:
+    s.case(range(1, 6), lambda: ...)
+    s.case(range(6, 10), lambda: ...)
+    s.default(lambda: ...)
+
+
+

Closed vs. Open ranges

+

Looking at the above code it’s a bit weird that 6 appears at the end of one case, beginning of the next. But range() is half open/closed.

+

To handle the inclusive case, I’ve added closed_range(start, stop). For example, closed_range(1,5) -> [1,2,3,4,5]

+
+
+

Why not just raw dict?

+

The biggest push back on this idea is that we already have this problem solved. You write the following code.

+
switch = {
+    1: method_on_one,
+    2: method_on_two,
+    3: method_three
+}
+
+result = switch.get(value, default_method_to_run)()
+

This works but is very low on the functionality level. We have a better solution here I believe. Let’s take this example and see how it looks in python-switch vs raw dicts:

+
## with python-switch:
+
+while True:
+    action = get_action(action)
+
+    with switch(action) as s:
+        s.case(['c', 'a'], create_account)
+        s.case('l', log_into_account)
+        s.case('r', register_cage)
+        s.case('u', update_availability)
+        s.case(['v', 'b'], view_bookings)
+        s.case('x', exit_app)
+        s.case('', lambda: None)
+        s.case(range(1,6), lambda: set_level(action))
+        s.default(unknown_command)
+    
+    print('Result is {}'.format(s.result))
+

Now compare that to the espoused pythonic way:

+
## with raw dicts
+
+while True:
+    action = get_action(action)
+
+    switch = {
+        'c': create_account,
+        'a': create_account,
+        'l': log_into_account,
+        'r': register_cage,
+        'u': update_availability,
+        'v': view_bookings,
+        'b': view_bookings,
+        'x': exit_app,
+        1: lambda: set_level(action),
+        2: lambda: set_level(action),
+        3: lambda: set_level(action),
+        4: lambda: set_level(action),
+        5: lambda: set_level(action),
+        '': lambda: None,
+    }
+    result = switch.get(action, unknown_command)()
+    print('Result is {}'.format(result))
+

Personally, I much prefer to read and write the one above. That’s why I wrote this module. It seems to convey the intent of switch way more than the dict. But either are options.

+
+
+

Why not just if / elif / else?

+

Another push back on this idea is that we already have this problem solved. Switch statements are really if / elif / else blocks. So you write the following code.

+
## with if / elif / else
+
+while True:
+    action = get_action(action)
+
+    if action == 'c' or action == 'a':
+        result = create_account()
+    elif action == 'l':
+        result = log_into_account()
+    elif action == 'r':
+        result = register_cage()
+    elif action == 'a':
+        result = update_availability()
+    elif action == 'v' or action == 'b':
+        result = view_bookings()
+    elif action == 'x':
+        result = exit_app()
+    elif action in {1, 2, 3, 4, 5}:
+        result = set_level(action)
+    else:
+        unknown_command()
+        
+    print('Result is {}'.format(result))
+

I actually believe this is a little better than the raw dict option. But there are still things that are harder.

+
    +
  • How would you deal with fall-through cleanly?
  • +
  • Did you notice the bug? We forgot to set result in default case (else) and will result in a runtime error (but only if that case hits).
  • +
  • There is another bug. update_availability will never run because its command (a) is bound to two cases. This is guarded against in switch and you would receive a duplicate case error the first time it runs at all.
  • +
  • While it’s pretty clear, it’s much more verbose and less declarative than the switch version.
  • +
+

Again, compare the if / elif / else to what you have with switch. This code is identical except doesn’t have the default case bug.

+
while True:
+    action = get_action(action)
+
+    with switch(action) as s:
+        s.case(['c', 'a'], create_account)
+        s.case('l', log_into_account)
+        s.case('r', register_cage)
+        s.case('u', update_availability)
+        s.case(['v', 'b'], view_bookings)
+        s.case('x', exit_app)
+        s.case('', lambda: None)
+        s.case(range(1,6), lambda: set_level(action))
+        s.default(unknown_command)
+    
+    print('Result is {}'.format(s.result))
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/keyboard-nav.js b/docs/keyboard-nav.js new file mode 100644 index 0000000..14ccfd1 --- /dev/null +++ b/docs/keyboard-nav.js @@ -0,0 +1,1139 @@ +/** + * Keyboard Navigation & Shortcuts for Great Docs + * + * Features: + * - `/` or `s` to focus search + * - `[` / `]` for previous/next page navigation + * - `q` to navigate to homepage + * - `u` to navigate to User Guide (when available) + * - `r` to navigate to API Reference (when available) + * - `m` or `n` to show/hide floating menu overlay (sidebar nav or navbar links) + * - `d` to toggle dark mode + * - `c` to copy page as Markdown (when available) + * - `h` or `?` to show/hide keyboard shortcuts help overlay + * - `Escape` to close overlay or unfocus active element + * - Dark mode aware + * - Respects reduced-motion preferences + * - Skips shortcuts when user is typing in inputs/textareas + * - ARIA attributes for screen reader accessibility + */ + +(function() { + 'use strict'; + + // i18n helper β€” read translations from + var _i18nCache = null; + function _gdT(key, fallback) { + if (!_i18nCache) { + try { + var meta = document.querySelector('meta[name="gd-i18n"]'); + _i18nCache = meta ? JSON.parse(meta.getAttribute('content')) : {}; + } catch (e) { _i18nCache = {}; } + } + return _i18nCache[key] || fallback; + } + + // State + var overlay = null; + var isOverlayOpen = false; + var menuOverlay = null; + var isMenuOpen = false; + + /** + * Check if the user prefers reduced motion + */ + function prefersReducedMotion() { + return window.matchMedia('(prefers-reduced-motion: reduce)').matches; + } + + /** + * Check if the active element is an input or editable area + */ + function isTyping() { + var el = document.activeElement; + if (!el) return false; + var tag = el.tagName; + if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true; + if (el.isContentEditable) return true; + // Quarto search autocomplete input + if (el.classList.contains('aa-Input')) return true; + return false; + } + + // ── Search Focus ───────────────────────────────────────────────────── + + function focusSearch() { + // Try Quarto's Algolia-style autocomplete input first + var searchInput = document.querySelector('.aa-Input'); + if (!searchInput) { + // Fall back to the Quarto search container (clicking it usually opens the search) + var searchContainer = document.querySelector('#quarto-search'); + if (searchContainer) { + var btn = searchContainer.querySelector('button') || + searchContainer.querySelector('[role="button"]'); + if (btn) { + btn.click(); + return; + } + } + } + if (searchInput) { + searchInput.focus(); + if (searchInput.select) searchInput.select(); + } + } + + // ── Page Navigation ────────────────────────────────────────────────── + + function navigatePrev() { + var link = document.querySelector('.nav-page-previous a.pagination-link'); + if (link) { + link.click(); + } + } + + function navigateNext() { + var link = document.querySelector('.nav-page-next a.pagination-link'); + if (link) { + link.click(); + } + } + + function navigateHome() { + // Use the navbar brand link (always points to site root) + var brand = document.querySelector('.navbar-brand'); + if (brand && brand.href) { + window.location.href = brand.href; + return; + } + // Fallback: navigate to site root + window.location.href = './'; + } + + /** + * Find a navbar link whose href contains the given path segment. + */ + function findNavbarLink(pathSegment) { + var links = document.querySelectorAll( + '#navbarCollapse > .navbar-nav.me-auto > .nav-item > .nav-link' + ); + for (var i = 0; i < links.length; i++) { + var href = links[i].getAttribute('href') || ''; + if (href.indexOf(pathSegment) !== -1) return links[i]; + } + return null; + } + + function hasUserGuide() { return !!findNavbarLink('user-guide/'); } + function hasReference() { return !!findNavbarLink('reference/'); } + + function navigateUserGuide() { + var link = findNavbarLink('user-guide/'); + if (link) window.location.href = link.getAttribute('href'); + } + + function navigateReference() { + var link = findNavbarLink('reference/'); + if (link) window.location.href = link.getAttribute('href'); + } + + // ── Show Menu Overlay ────────────────────────────────────────────── + + /** + * Detect whether the current page is the homepage. + * Homepage body has `nav-fixed` but NOT `nav-sidebar`. + */ + function isHomepage() { + return !document.body.classList.contains('nav-sidebar'); + } + + /** + * Build menu items from the top navbar links (used on homepage). + * Returns an array of {text, href, active, section, html, badgeHtml} objects. + */ + function getNavbarItems() { + var items = []; + var links = document.querySelectorAll( + '#navbarCollapse > .navbar-nav.me-auto > .nav-item > .nav-link' + ); + for (var i = 0; i < links.length; i++) { + var a = links[i]; + var text = a.querySelector('.menu-text'); + if (!text) continue; + items.push({ + text: text.textContent.trim(), + html: text.innerHTML, + badgeHtml: '', + href: a.getAttribute('href') || '#', + active: a.classList.contains('active'), + section: null + }); + } + return items; + } + + /** + * Build menu items from the left sidebar navigation (used on content pages). + * Handles both sectioned sidebars (User Guide) and flat sidebars (Recipes). + * Returns an array of {text, href, active, section, html, badgeHtml, upcomingHtml} objects. + * - html: innerHTML of .menu-text (includes icons + text) + * - badgeHtml: outerHTML of .gd-sidebar-status-badge (if present) + * - upcomingHtml: outerHTML of .gd-sidebar-upcoming rocket icon (if present) + */ + function getSidebarItems() { + var items = []; + var sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return items; + + function extractItem(a, sectionTitle) { + var menuText = a.querySelector('.menu-text'); + if (!menuText) return null; + var badge = a.querySelector('.gd-sidebar-status-badge'); + var upcoming = a.querySelector('.gd-sidebar-upcoming'); + return { + text: menuText.textContent.trim(), + html: menuText.innerHTML, + badgeHtml: badge ? badge.outerHTML : '', + upcomingHtml: upcoming ? upcoming.outerHTML : '', + href: a.getAttribute('href') || '#', + active: a.classList.contains('active'), + section: sectionTitle + }; + } + + function extractSectionHtml(sec) { + var headerEl = sec.querySelector(':scope > .sidebar-item-container .menu-text'); + if (!headerEl) { + // Try sidebar-item-text for section headers without .menu-text + headerEl = sec.querySelector(':scope > .sidebar-item-container .sidebar-item-text'); + } + return headerEl ? headerEl.innerHTML : null; + } + + var sections = sidebar.querySelectorAll('.sidebar-item-section'); + + if (sections.length > 0) { + // Sectioned sidebar (e.g., User Guide pages) + // First, capture any top-level links outside sections (e.g., "API Index") + var menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (menuContainer) { + var topLis = menuContainer.querySelectorAll(':scope > ul > li.sidebar-item:not(.sidebar-item-section)'); + for (var t = 0; t < topLis.length; t++) { + var topLink = topLis[t].querySelector('.sidebar-link'); + if (topLink) { + var topItem = extractItem(topLink, null); + if (topItem) items.push(topItem); + } + } + } + + for (var s = 0; s < sections.length; s++) { + var sec = sections[s]; + var sectionHtml = extractSectionHtml(sec); + + var links = sec.querySelectorAll('.sidebar-section .sidebar-link'); + for (var i = 0; i < links.length; i++) { + var item = extractItem(links[i], sectionHtml); + if (item) { + items.push(item); + sectionHtml = null; + } + } + } + } else { + // Flat sidebar (e.g., Recipes, custom sections) + var links = sidebar.querySelectorAll('.sidebar-item .sidebar-link'); + for (var i = 0; i < links.length; i++) { + var item = extractItem(links[i], null); + if (item) items.push(item); + } + } + + return items; + } + + /** + * Detect whether the current page is a Reference page (API or CLI). + */ + function isReferencePage() { + return document.body.classList.contains('gd-ref-sidebar'); + } + + /** + * Detect whether the current page is CLI Reference (vs API Reference). + */ + function isCliReferencePage() { + return window.location.pathname.indexOf('/reference/cli/') !== -1; + } + + /** + * Detect whether the current page is MCP Reference. + */ + function isMcpReferencePage() { + return window.location.pathname.indexOf('/reference/mcp/') !== -1; + } + + /** + * Get enabled reference sections from body data attribute. + */ + function getRefSections() { + var attr = document.body.getAttribute('data-gd-ref-sections'); + if (attr) return attr.split(',').map(function(s) { return s.trim(); }).filter(Boolean); + // Fallback detection + var sections = ['api']; + if (document.querySelector('.reference-switcher-container') || + document.querySelector('a[href*="/reference/cli/"]') || + isCliReferencePage()) { + sections.push('cli'); + } + if (document.querySelector('a[href*="/reference/mcp/"]') || + isMcpReferencePage()) { + sections.push('mcp'); + } + return sections; + } + + /** + * Check if CLI Reference docs exist (switcher should show both tabs). + */ + function hasCliReference() { + // Check multiple signals: the reference-switcher widget (injected by + // reference-switcher.js into the hidden sidebar), any to CLI docs, + // or being on a CLI page itself. + return !!document.querySelector('.reference-switcher-container') || + !!document.querySelector('a[href*="/reference/cli/"]') || + isCliReferencePage(); + } + + /** + * Build the reference switcher HTML for the keyboard nav overlay. + * Uses segmented buttons for 2 sections, dropdown for 3+. + */ + function buildRefSwitcherHtml() { + var sections = getRefSections(); + if (sections.length < 2) return ''; + + var currentRef = 'api'; + if (isMcpReferencePage()) currentRef = 'mcp'; + else if (isCliReferencePage()) currentRef = 'cli'; + + var sectionMeta = { + api: { label: _gdT('api', 'Python API'), svg: '' }, + cli: { label: _gdT('cli', 'CLI'), svg: '' }, + mcp: { label: _gdT('mcp', 'MCP Server'), svg: '' } + }; + + var html = '
'; + for (var i = 0; i < sections.length; i++) { + var id = sections[i]; + var meta = sectionMeta[id] || { label: id, svg: '' }; + var active = id === currentRef ? ' active' : ''; + html += ''; + } + html += '
'; + return html; + } + + /** + * Build the reference filter input HTML. + */ + function buildRefFilterHtml(itemCount) { + if (itemCount < 15) return ''; + var placeholder = _gdT('sidebar_filter_placeholder', 'Filter...'); + var html = '
'; + html += ''; + html += ''; + html += '
'; + return html; + } + + /** + * Attach filter behaviour to the overlay for reference pages. + */ + function attachRefFilter(overlay) { + var input = overlay.querySelector('.gd-menu-ref-filter-input'); + if (!input) return; + + input.addEventListener('input', function() { + var query = input.value.toLowerCase().trim(); + var items = overlay.querySelectorAll('.gd-menu-item'); + var sections = overlay.querySelectorAll('.gd-menu-section'); + + // Show/hide items based on text match + for (var i = 0; i < items.length; i++) { + var text = items[i].textContent.toLowerCase(); + items[i].parentElement.style.display = (!query || text.indexOf(query) !== -1) ? '' : 'none'; + } + + // Show section headers only if at least one child item is visible + for (var s = 0; s < sections.length; s++) { + var li = sections[s]; + var next = li.nextElementSibling; + var anyVisible = false; + while (next && !next.classList.contains('gd-menu-section')) { + if (next.style.display !== 'none') anyVisible = true; + next = next.nextElementSibling; + } + li.style.display = anyVisible ? '' : 'none'; + } + }); + + // Focus filter on open (after transition) + setTimeout(function() { input.focus(); }, 220); + } + + /** + * Parse sidebar items from an HTML string (fetched from another page). + * Returns an array of {text, html, href, section} objects. + */ + function parseSidebarItemsFromHtml(htmlStr, baseUrl) { + var parser = new DOMParser(); + var doc = parser.parseFromString(htmlStr, 'text/html'); + var sidebar = doc.getElementById('quarto-sidebar'); + if (!sidebar) return []; + + var items = []; + var sections = sidebar.querySelectorAll('.sidebar-item-section'); + + // Resolve relative URLs against the fetched page's base + var fullBase = new URL(baseUrl, window.location.origin).href; + function resolveHref(href) { + if (!href || href === '#') return '#'; + try { return new URL(href, fullBase).pathname; } + catch (e) { return href; } + } + + function extractParsedItem(a, sectionText) { + var menuText = a.querySelector('.menu-text'); + if (!menuText) return null; + return { + text: menuText.textContent.trim(), + html: menuText.innerHTML, + href: resolveHref(a.getAttribute('href')), + active: false, + section: sectionText + }; + } + + if (sections.length > 0) { + // Top-level links outside sections (like "API Index") + var menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (menuContainer) { + var topLis = menuContainer.querySelectorAll(':scope > ul > li.sidebar-item:not(.sidebar-item-section)'); + for (var t = 0; t < topLis.length; t++) { + var topLink = topLis[t].querySelector('.sidebar-link'); + if (topLink) { + var topItem = extractParsedItem(topLink, null); + if (topItem) items.push(topItem); + } + } + } + + for (var s = 0; s < sections.length; s++) { + var sec = sections[s]; + var headerEl = sec.querySelector(':scope > .sidebar-item-container .menu-text') || + sec.querySelector(':scope > .sidebar-item-container .sidebar-item-text'); + var sectionText = headerEl ? headerEl.innerHTML : null; + var links = sec.querySelectorAll('.sidebar-section .sidebar-link'); + for (var i = 0; i < links.length; i++) { + var item = extractParsedItem(links[i], sectionText); + if (item) { + items.push(item); + sectionText = null; + } + } + } + } else { + var flatLinks = sidebar.querySelectorAll('.sidebar-item .sidebar-link'); + for (var i = 0; i < flatLinks.length; i++) { + var item = extractParsedItem(flatLinks[i], null); + if (item) items.push(item); + } + } + + return items; + } + + /** + * Render items into the overlay list (replacing current contents). + */ + function renderItemsInOverlay(overlay, items) { + var listEl = overlay.querySelector('.gd-menu-list'); + if (!listEl) return; + + var html = ''; + var currentSection = null; + for (var i = 0; i < items.length; i++) { + var item = items[i]; + if (item.section && item.section !== currentSection) { + currentSection = item.section; + // Section text comes from innerHTML (already HTML-safe), so + // insert directly without escaping to avoid double-encoding + // entities like & β†’ &amp; + html += ''; + } + var activeClass = item.active ? ' gd-menu-item-active' : ''; + var label = item.html || escapeHtml(item.text); + html += '
  • ' + + '' + label + '' + + '
  • '; + } + listEl.innerHTML = html; + + // Clear filter input if present + var filterInput = overlay.querySelector('.gd-menu-ref-filter-input'); + if (filterInput) { + filterInput.value = ''; + filterInput.dispatchEvent(new Event('input')); + } + } + + /** + * Attach switcher behaviour: clicking a tab fetches items from the + * other reference section and swaps the list in the overlay without + * navigating away. + */ + function attachRefSwitcher(overlay) { + var buttons = overlay.querySelectorAll('.gd-menu-ref-switcher-btn'); + if (!buttons.length) return; + + var basePath = window.location.pathname.split('/reference/')[0]; + var cache = {}; // cache fetched items by ref type + + // Pre-populate current section's items from what's already rendered + var currentType = 'api'; + if (isMcpReferencePage()) currentType = 'mcp'; + else if (isCliReferencePage()) currentType = 'cli'; + + var refPaths = { + api: basePath + '/reference/index.html', + cli: basePath + '/reference/cli/index.html', + mcp: basePath + '/reference/mcp/index.html' + }; + + for (var i = 0; i < buttons.length; i++) { + (function(btn) { + btn.addEventListener('click', function() { + var refType = btn.getAttribute('data-ref'); + + // Update active state on buttons + for (var b = 0; b < buttons.length; b++) { buttons[b].classList.remove('active'); } + btn.classList.add('active'); + + // If switching to the section we're already on, re-render from sidebar + if (refType === currentType) { + var items = getSidebarItems(); + renderItemsInOverlay(overlay, items); + return; + } + + // If cached, render immediately + if (cache[refType]) { + renderItemsInOverlay(overlay, cache[refType]); + return; + } + + // Fetch the target section's index page and parse its sidebar + var url = refPaths[refType] || basePath + '/reference/index.html'; + + fetch(url) + .then(function(res) { return res.text(); }) + .then(function(htmlStr) { + var items = parseSidebarItemsFromHtml(htmlStr, url); + cache[refType] = items; + // Only render if this tab is still active + if (btn.classList.contains('active')) { + renderItemsInOverlay(overlay, items); + } + }) + .catch(function() { + // On error, fall back to navigation + window.location.href = url; + }); + }); + })(buttons[i]); + } + } + + /** + * Create the floating menu overlay element. + */ + function createMenuOverlay() { + var el = document.createElement('div'); + el.className = 'gd-menu-overlay'; + el.setAttribute('role', 'dialog'); + el.setAttribute('aria-modal', 'true'); + el.setAttribute('aria-label', + _gdT('kb_show_menu', 'Show menu')); + + var homepage = isHomepage(); + var refPage = isReferencePage(); + var items = homepage ? getNavbarItems() : getSidebarItems(); + var title; + if (homepage) { + title = _gdT('kb_menu_title_site', 'Site Navigation'); + } else if (refPage) { + title = isCliReferencePage() + ? _gdT('cli_reference', 'CLI Reference') + : _gdT('api_reference', 'API Reference'); + } else { + title = _gdT('kb_menu_title_section', 'Section Navigation'); + } + + var html = '
    '; + html += '
    '; + html += '

    ' + escapeHtml(title) + '

    '; + html += ''; + html += '
    '; + + // Reference pages: inject switcher before the list + if (refPage) { + html += buildRefSwitcherHtml(); + } + + html += '
    '; + + el.innerHTML = html; + + // Attach reference-specific interactivity + if (refPage) { + attachRefSwitcher(el); + } + + return el; + } + + // Menu keyboard navigation state + var menuSelectedIndex = -1; + + /** + * Get all navigable menu items from the overlay. + */ + function getMenuItems() { + if (!menuOverlay) return []; + return menuOverlay.querySelectorAll('.gd-menu-item'); + } + + /** + * Update the visual focus indicator on menu items. + */ + function updateMenuFocus() { + var items = getMenuItems(); + for (var i = 0; i < items.length; i++) { + if (i === menuSelectedIndex) { + items[i].classList.add('gd-menu-item-focused'); + items[i].scrollIntoView({ block: 'nearest' }); + } else { + items[i].classList.remove('gd-menu-item-focused'); + } + } + } + + /** + * Handle keyboard events within the menu overlay. + */ + function handleMenuKeydown(e) { + var items = getMenuItems(); + if (items.length === 0) return; + + switch (e.key) { + case 'ArrowDown': + case 'ArrowRight': + case 'ArrowUp': + case 'ArrowLeft': + e.preventDefault(); + // Any arrow press selects the first item + if (menuSelectedIndex < 0) { + menuSelectedIndex = 0; + } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') { + menuSelectedIndex = Math.min(menuSelectedIndex + 1, items.length - 1); + } else { + menuSelectedIndex = Math.max(menuSelectedIndex - 1, 0); + } + updateMenuFocus(); + break; + + case 'Enter': + if (menuSelectedIndex >= 0 && menuSelectedIndex < items.length) { + e.preventDefault(); + items[menuSelectedIndex].click(); + } + break; + } + } + + function showMenu() { + // Always recreate to pick up current page state + if (menuOverlay) { + menuOverlay.remove(); + menuOverlay = null; + } + + menuOverlay = createMenuOverlay(); + document.body.appendChild(menuOverlay); + menuSelectedIndex = -1; + + // Close button + var closeBtn = menuOverlay.querySelector('.gd-menu-overlay-close'); + closeBtn.addEventListener('click', hideMenu); + + // Click on backdrop + menuOverlay.addEventListener('click', function(e) { + if (e.target === menuOverlay) { + hideMenu(); + } + }); + + // Lock body scroll and add backdrop blur on mobile + document.body.classList.add('gd-menu-open'); + + // On mobile, force headroom into the "unpinned" state so the + // full navbar slides up and only the Title Bar stays visible. + // This prevents the overlay card from appearing behind a tall + // header when the user is at the top of the page or has just + // scrolled up. + var header = document.querySelector('#quarto-header'); + var didFreezeHeadroom = false; + if (header && window.matchMedia('(max-width: 991.98px)').matches) { + header.classList.remove('headroom--pinned'); + header.classList.add('headroom--unpinned'); + // Freeze headroom via Quarto's toggle so it doesn't re-pin + if (typeof window.quartoToggleHeadroom === 'function') { + window.quartoToggleHeadroom(); // freeze + didFreezeHeadroom = true; + } + } + // Store so hideMenu can unfreeze only if we froze + showMenu._frozeHeadroom = didFreezeHeadroom; + + // Force reflow then show + void menuOverlay.offsetWidth; + menuOverlay.classList.add('gd-menu-overlay-visible'); + isMenuOpen = true; + + // Auto-scroll the active item into view (centered) + requestAnimationFrame(function() { + var activeItem = menuOverlay.querySelector('.gd-menu-item-active'); + if (activeItem) { + activeItem.scrollIntoView({ block: 'center', behavior: 'instant' }); + } + }); + } + + function hideMenu() { + if (!menuOverlay) return; + menuOverlay.classList.remove('gd-menu-overlay-visible'); + document.body.classList.remove('gd-menu-open'); + + // Resume headroom so it can pin/unpin normally again + if (showMenu._frozeHeadroom && typeof window.quartoToggleHeadroom === 'function') { + window.quartoToggleHeadroom(); // unfreeze + showMenu._frozeHeadroom = false; + } + + isMenuOpen = false; + menuSelectedIndex = -1; + // Remove after transition + setTimeout(function() { + if (menuOverlay && !isMenuOpen) { + menuOverlay.remove(); + menuOverlay = null; + } + }, 200); + } + + // ── Copy Page ──────────────────────────────────────────────────────── + + function copyPage() { + var btn = document.querySelector('.gd-copy-md-btn'); + if (btn) btn.click(); + } + + // ── Dark Mode Toggle ───────────────────────────────────────────────── + + function toggleDarkMode() { + // Delegate to the existing dark-mode-toggle button if present + var btn = document.getElementById('dark-mode-toggle'); + if (btn) { + btn.click(); + return; + } + } + + // ── Help Overlay ───────────────────────────────────────────────────── + + var SHORTCUT_GROUPS = [ + { + titleKey: 'kb_group_navigation', + titleFallback: 'Navigation', + shortcuts: [ + { keys: ['s', '/'], descKey: 'kb_focus_search', descFallback: 'Focus search' }, + { keys: ['[', ']'], descKey: 'kb_prev_next_page', descFallback: 'Previous / next page', separator: ' / ' }, + { keys: ['m', 'n'], descKey: 'kb_show_menu', descFallback: 'Show menu' }, + { keys: ['q'], descKey: 'kb_home', descFallback: 'Go to homepage' }, + { keys: ['u'], descKey: 'kb_user_guide', descFallback: 'User Guide', visible: hasUserGuide }, + { keys: ['r'], descKey: 'kb_api_reference', descFallback: 'API Reference', visible: hasReference }, + ] + }, + { + titleKey: 'kb_group_display', + titleFallback: 'Display', + shortcuts: [ + { keys: ['d'], descKey: 'kb_toggle_dark', descFallback: 'Toggle dark mode' }, + { keys: ['c'], descKey: 'kb_copy_page', descFallback: 'Copy page as Markdown' }, + ] + }, + { + titleKey: 'kb_group_general', + titleFallback: 'General', + shortcuts: [ + { keys: ['h', '?'], descKey: 'kb_show_help', descFallback: 'Show keyboard shortcuts' }, + { keys: ['Esc'], descKey: 'kb_close_dismiss', descFallback: 'Close / dismiss' }, + ] + }, + ]; + + function createOverlay() { + var el = document.createElement('div'); + el.className = 'gd-keyboard-overlay'; + el.setAttribute('role', 'dialog'); + el.setAttribute('aria-modal', 'true'); + el.setAttribute('aria-label', + _gdT('kb_overlay_title', 'Keyboard shortcuts')); + + var title = _gdT('kb_overlay_title', 'Keyboard shortcuts'); + + var html = '
    '; + html += '
    '; + html += '

    ' + escapeHtml(title) + '

    '; + html += ''; + html += '
    '; + + html += '
    '; + + for (var g = 0; g < SHORTCUT_GROUPS.length; g++) { + var group = SHORTCUT_GROUPS[g]; + html += '
    '; + html += '

    ' + escapeHtml(_gdT(group.titleKey, group.titleFallback)) + '

    '; + html += '
    '; + for (var s = 0; s < group.shortcuts.length; s++) { + var sc = group.shortcuts[s]; + if (sc.visible && !sc.visible()) continue; + html += '
    '; + html += '
    '; + for (var k = 0; k < sc.keys.length; k++) { + if (k > 0) { + var sep = sc.separator != null ? sc.separator : + ' ' + + escapeHtml(_gdT('kb_or', 'or')) + ' '; + html += sep; + } + html += '' + escapeHtml(sc.keys[k]) + ''; + } + html += '
    '; + html += '
    ' + escapeHtml(_gdT(sc.descKey, sc.descFallback)) + '
    '; + html += '
    '; + } + html += '
    '; + html += '
    '; + } + + html += '
    '; + + el.innerHTML = html; + return el; + } + + function escapeHtml(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; + } + + function showOverlay() { + if (!overlay) { + overlay = createOverlay(); + document.body.appendChild(overlay); + + // Close button + var closeBtn = overlay.querySelector('.gd-keyboard-overlay-close'); + closeBtn.addEventListener('click', hideOverlay); + + // Click on backdrop + overlay.addEventListener('click', function(e) { + if (e.target === overlay) { + hideOverlay(); + } + }); + } + + if (prefersReducedMotion()) { + overlay.classList.add('gd-keyboard-overlay-visible'); + } else { + // Force reflow before adding the class for animation + void overlay.offsetWidth; + overlay.classList.add('gd-keyboard-overlay-visible'); + } + isOverlayOpen = true; + + // Focus the close button for keyboard users + var closeBtn = overlay.querySelector('.gd-keyboard-overlay-close'); + if (closeBtn) closeBtn.focus(); + } + + function hideOverlay() { + if (!overlay) return; + overlay.classList.remove('gd-keyboard-overlay-visible'); + isOverlayOpen = false; + } + + // ── Keyboard Event Handler ─────────────────────────────────────────── + + function handleKeydown(e) { + // When menu is open, handle all menu-related keys + if (isMenuOpen) { + if (e.key === 'Escape' || e.key === 'm' || e.key === 'n') { + e.preventDefault(); + hideMenu(); + return; + } + // Delegate arrow keys and Enter to menu navigation + handleMenuKeydown(e); + return; + } + + // When help overlay is open, handle Escape and toggle keys (h/?) + if (isOverlayOpen) { + if (e.key === 'Escape' || e.key === 'h' || e.key === '?') { + e.preventDefault(); + hideOverlay(); + } + return; + } + + // Skip if user is typing in an input + if (isTyping()) return; + + // Skip if modifier keys are held (allow browser/OS shortcuts) + if (e.ctrlKey || e.metaKey || e.altKey) return; + + switch (e.key) { + case '?': + case 'h': + e.preventDefault(); + showOverlay(); + break; + + case 's': + e.preventDefault(); + focusSearch(); + break; + + // Note: '/' is handled by sidebar-filter.js when it's active. + // When sidebar-filter is not present, we handle it here. + case '/': + // Only if sidebar-filter hasn't already handled it + if (!document.querySelector('.sidebar-filter-input')) { + e.preventDefault(); + focusSearch(); + } + break; + + case '[': + e.preventDefault(); + navigatePrev(); + break; + + case ']': + e.preventDefault(); + navigateNext(); + break; + + case 'm': + case 'n': + e.preventDefault(); + showMenu(); + break; + + case 'q': + e.preventDefault(); + navigateHome(); + break; + + case 'u': + if (hasUserGuide()) { + e.preventDefault(); + navigateUserGuide(); + } + break; + + case 'r': + if (hasReference()) { + e.preventDefault(); + navigateReference(); + } + break; + + case 'd': + e.preventDefault(); + toggleDarkMode(); + break; + + case 'c': + e.preventDefault(); + copyPage(); + break; + + case 'Escape': + // Blur the active element + if (document.activeElement && document.activeElement !== document.body) { + document.activeElement.blur(); + } + break; + } + } + + // ── Navbar Button ──────────────────────────────────────────────── + + /** + * Create the keyboard shortcuts navbar button. + * Uses the Lucide "keyboard" icon (MIT-licensed). + */ + function createKeyboardButton() { + var container = document.createElement('div'); + container.id = 'gd-keyboard-btn-container'; + + var btn = document.createElement('button'); + btn.id = 'gd-keyboard-btn'; + btn.className = 'gd-keyboard-btn'; + btn.type = 'button'; + btn.setAttribute('aria-label', + _gdT('kb_show_help', 'Show keyboard shortcuts')); + btn.setAttribute('data-tippy-content', + _gdT('kb_show_help', 'Show keyboard shortcuts')); + btn.innerHTML = + ''; + + container.appendChild(btn); + return container; + } + + /** + * Insert the keyboard button into the navbar. + */ + function insertKeyboardButton() { + // Insert into navbarCollapse; navbar-widgets.js will collect it + // into the unified #gd-navbar-widgets container. + var collapse = document.getElementById('navbarCollapse'); + if (!collapse) return; + + var container = createKeyboardButton(); + var navItem = document.createElement('li'); + navItem.className = 'nav-item'; + navItem.appendChild(container); + + // Append to navbarCollapse (the collector will move it) + collapse.appendChild(navItem); + + // Click handler + var btn = document.getElementById('gd-keyboard-btn'); + if (btn) { + btn.addEventListener('click', function() { + if (isOverlayOpen) { + hideOverlay(); + } else { + showOverlay(); + } + }); + + // Initialize tooltip directly β€” window.tippy is available from + // Quarto's bundle before any include-after-body scripts run. + if (window.tippy) { + window.tippy(btn, { + content: btn.getAttribute('data-tippy-content'), + placement: 'bottom', + animation: 'shift-away', + duration: [200, 150], + delay: [0, 0], + arrow: true, + }); + } + } + } + + // ── Initialization ─────────────────────────────────────────────────── + + function init() { + document.addEventListener('keydown', handleKeydown); + insertKeyboardButton(); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } + + // Expose menu API so the sidebar toggle button can reuse it + window.__gdMenu = { + show: showMenu, + hide: hideMenu, + isOpen: function() { return isMenuOpen; } + }; +})(); diff --git a/docs/license.html b/docs/license.html new file mode 100644 index 0000000..bce7c65 --- /dev/null +++ b/docs/license.html @@ -0,0 +1,624 @@ + + + + + + + + + +License – switchlang | switchlang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/llms-full.txt b/docs/llms-full.txt new file mode 100644 index 0000000..0321e77 --- /dev/null +++ b/docs/llms-full.txt @@ -0,0 +1,41 @@ +---------------------------------------------------------------------- +This is the API documentation for the switchlang library. +---------------------------------------------------------------------- + + +## The switch block + +The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. + + + +switch(value: Any) + +switch is a module-level implementation of the switch statement for Python. +See https://github.com/mikeckennedy/python-switch for full details. +Copyright Michael Kennedy (https://mkennedy.codes) +License: MIT + + +## Range helpers + +Helpers for mapping ranges of values to a single case. + + + +closed_range(start: int, stop: int, step=1) -> range + +Creates a closed range that allows you to specify a case +from [start, stop] inclusively. + +``` + with switch(value) as s: + s.case(closed_range(1, 5), lambda: "1-to-5") + s.case(closed_range(6, 7), lambda: "6") + s.default(lambda: 'default') +``` + +:param start: The inclusive lower bound of the range [start, stop]. +:param stop: The inclusive upper bound of the range [start, stop]. +:param step: The step size between elements (defaults to 1). +:return: A range() generator that has a closed upper bound. diff --git a/docs/llms.txt b/docs/llms.txt new file mode 100644 index 0000000..9700d65 --- /dev/null +++ b/docs/llms.txt @@ -0,0 +1,19 @@ +# switchlang + +> Adds switch blocks to the Python language. + +## Docs + +### API Reference + +#### The switch block +> The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. + + +- [switch](https://mkennedy.codes/docs/python-switch/reference/switch.html): switch is a module-level implementation of the switch statement for Python + +#### Range helpers +> Helpers for mapping ranges of values to a single case. + + +- [closed_range](https://mkennedy.codes/docs/python-switch/reference/closed_range.html): Creates a closed range that allows you to specify a case diff --git a/docs/mermaid-renderer.js b/docs/mermaid-renderer.js new file mode 100644 index 0000000..7a23f45 --- /dev/null +++ b/docs/mermaid-renderer.js @@ -0,0 +1,205 @@ +/** + * Great Docs Mermaid Theme Fix + * + * Forces mermaid diagrams to use light theme colors in dark mode + * by modifying the SVG's internal style block after Quarto renders. + */ + +(function() { + 'use strict'; + + function isDarkMode() { + return document.documentElement.classList.contains('quarto-dark') || + document.body.classList.contains('quarto-dark'); + } + + /** + * Light mode CSS rules to inject into SVG style blocks when in dark mode. + * These override the dark theme colors mermaid generates. + * Must be comprehensive to catch all text elements. + */ + function getLightModeOverrides(id) { + return '\n' + + /* Universal text color overrides - catch everything */ + '#' + id + ' text { fill: #333 !important; }\n' + + '#' + id + ' tspan { fill: #333 !important; }\n' + + '#' + id + ' .label { fill: #333 !important; color: #333 !important; }\n' + + '#' + id + ' .label text { fill: #333 !important; }\n' + + '#' + id + ' .label tspan { fill: #333 !important; }\n' + + '#' + id + ' span { color: #333 !important; }\n' + + '#' + id + ' p { color: #333 !important; }\n' + + '#' + id + ' div { color: #333 !important; }\n' + + '#' + id + ' foreignObject { color: #333 !important; }\n' + + '#' + id + ' foreignObject * { color: #333 !important; }\n' + + /* Node-specific text */ + '#' + id + ' .nodeLabel { color: #333 !important; fill: #333 !important; }\n' + + '#' + id + ' .nodeLabel p { color: #333 !important; }\n' + + '#' + id + ' .nodeLabel span { color: #333 !important; }\n' + + '#' + id + ' .node text { fill: #333 !important; }\n' + + '#' + id + ' .node tspan { fill: #333 !important; }\n' + + '#' + id + ' .node foreignObject div { color: #333 !important; }\n' + + /* Node shapes */ + '#' + id + ' .node rect, #' + id + ' .node circle, #' + id + ' .node ellipse, #' + id + ' .node polygon, #' + id + ' .node path { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + /* Edge labels */ + '#' + id + ' .edgeLabel { background-color: #e8e8e8 !important; color: #333 !important; }\n' + + '#' + id + ' .edgeLabel rect { fill: #e8e8e8 !important; }\n' + + '#' + id + ' .edgeLabel p { background-color: transparent !important; color: #333 !important; }\n' + + '#' + id + ' .edgeLabel span { color: #333 !important; }\n' + + '#' + id + ' .edgeLabel text { fill: #333 !important; }\n' + + '#' + id + ' .edgeLabel tspan { fill: #333 !important; }\n' + + '#' + id + ' .labelBkg { fill: #e8e8e8 !important; }\n' + + /* Edges and arrows */ + '#' + id + ' .edgePath .path, #' + id + ' .flowchart-link { stroke: #333 !important; }\n' + + '#' + id + ' .marker { fill: #333 !important; stroke: #333 !important; }\n' + + '#' + id + ' .arrowheadPath { fill: #333 !important; }\n' + + /* Clusters */ + '#' + id + ' .cluster rect { fill: #ffffde !important; stroke: #aaaa33 !important; }\n' + + '#' + id + ' .cluster text { fill: #333 !important; }\n' + + '#' + id + ' .cluster tspan { fill: #333 !important; }\n' + + '#' + id + ' .cluster span { color: #333 !important; }\n' + + '#' + id + ' .cluster-label text { fill: #333 !important; }\n' + + '#' + id + ' .cluster-label span { color: #333 !important; }\n' + + /* Sequence diagrams */ + '#' + id + ' .actor { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' .actor text { fill: #333 !important; }\n' + + '#' + id + ' .actor tspan { fill: #333 !important; }\n' + + '#' + id + ' text.actor { fill: #333 !important; }\n' + + '#' + id + ' text.actor > tspan { fill: #333 !important; }\n' + + '#' + id + ' .messageText { fill: #333 !important; stroke: none !important; }\n' + + '#' + id + ' .loopText { fill: #333 !important; }\n' + + '#' + id + ' .loopText tspan { fill: #333 !important; }\n' + + '#' + id + ' .noteText { fill: #333 !important; }\n' + + '#' + id + ' .noteText tspan { fill: #333 !important; }\n' + + '#' + id + ' .labelText { fill: #333 !important; color: #333 !important; }\n' + + '#' + id + ' .labelText tspan { fill: #333 !important; }\n' + + '#' + id + ' .sequenceNumber { fill: #fff !important; }\n' + + '#' + id + ' line { stroke: #999 !important; }\n' + + '#' + id + ' .messageLine0, #' + id + ' .messageLine1 { stroke: #333 !important; }\n' + + '#' + id + ' .labelBox { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' .loopLine { stroke: #9370DB !important; fill: #ECECFF !important; }\n' + + /* State diagrams */ + '#' + id + ' g.stateGroup rect { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' g.stateGroup text { fill: #333 !important; }\n' + + '#' + id + ' g.stateGroup .state-title { fill: #333 !important; }\n' + + '#' + id + ' .statediagram-state text { fill: #333 !important; }\n' + + '#' + id + ' .transition { stroke: #333 !important; }\n' + + /* Gantt */ + '#' + id + ' .section0, #' + id + ' .section2 { fill: #ECECFF !important; }\n' + + '#' + id + ' .section1, #' + id + ' .section3 { fill: #f8f8f8 !important; }\n' + + '#' + id + ' .taskText { fill: #333 !important; }\n' + + '#' + id + ' .taskTextOutsideLeft, #' + id + ' .taskTextOutsideRight { fill: #333 !important; }\n' + + '#' + id + ' .sectionTitle { fill: #333 !important; }\n' + + '#' + id + ' .grid .tick line { stroke: #ccc !important; }\n' + + '#' + id + ' .grid .tick text { fill: #333 !important; }\n' + + '#' + id + ' .titleText { fill: #333 !important; }\n' + + /* Pie */ + '#' + id + ' .pieCircle { stroke: #fff !important; }\n' + + '#' + id + ' .pieTitleText { fill: #333 !important; }\n' + + '#' + id + ' .pieOuterCircle { stroke: #333 !important; }\n' + + '#' + id + ' .slice { stroke: #fff !important; }\n' + + '#' + id + ' .legend text { fill: #333 !important; }\n' + + /* Class diagrams */ + '#' + id + ' .classGroup rect { fill: #ECECFF !important; stroke: #9370DB !important; }\n' + + '#' + id + ' .classGroup text { fill: #333 !important; }\n' + + '#' + id + ' .classGroup tspan { fill: #333 !important; }\n' + + '#' + id + ' .classGroup line, #' + id + ' .divider { stroke: #9370DB !important; }\n' + + '#' + id + ' .relation { stroke: #333 !important; }\n' + + '#' + id + ' .cardinality { fill: #333 !important; }\n' + + '#' + id + ' .classLabel text { fill: #333 !important; }\n' + + '#' + id + ' .classLabel tspan { fill: #333 !important; }\n' + + /* Flowchart title */ + '#' + id + ' .flowchartTitleText { fill: #333 !important; }\n'; + } + + /** + * Fix a single SVG by injecting light mode overrides and fixing inline styles + */ + function fixSvg(svg) { + if (!svg.id) return; + if (svg.dataset.gdFixed === 'true') return; + + var styleEl = svg.querySelector('style'); + if (!styleEl) return; + + // Inject CSS overrides + styleEl.textContent += getLightModeOverrides(svg.id); + + // Also directly fix inline styles on p, span, div elements + // This handles cases where mermaid sets inline style="color: ..." + var textElements = svg.querySelectorAll('p, span, div, .nodeLabel, .edgeLabel'); + textElements.forEach(function(el) { + el.style.setProperty('color', '#333', 'important'); + }); + + // Fix foreignObject children + var foreignObjects = svg.querySelectorAll('foreignObject *'); + foreignObjects.forEach(function(el) { + if (el.style) { + el.style.setProperty('color', '#333', 'important'); + } + }); + + svg.dataset.gdFixed = 'true'; + } + + /** + * Process all mermaid SVGs + */ + function processAllSvgs() { + var svgs = document.querySelectorAll('svg.mermaid-js, svg[id^="mermaid-"]'); + + if (isDarkMode()) { + svgs.forEach(fixSvg); + } + } + + /** + * Set up observer for theme changes and new SVGs + */ + function setupObserver() { + var observer = new MutationObserver(function(mutations) { + var shouldProcess = false; + + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + if (mutation.type === 'attributes' && mutation.attributeName === 'class') { + shouldProcess = true; + break; + } + if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { + shouldProcess = true; + break; + } + } + + if (shouldProcess) { + setTimeout(processAllSvgs, 100); + } + }); + + observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); + observer.observe(document.body, { + attributes: true, + attributeFilter: ['class'], + childList: true, + subtree: true + }); + } + + function init() { + setupObserver(); + + function afterLoad() { + setTimeout(processAllSvgs, 300); + setTimeout(processAllSvgs, 1000); + } + + if (document.readyState === 'complete') { + afterLoad(); + } else { + window.addEventListener('load', afterLoad); + } + } + + init(); +})(); diff --git a/docs/navbar-widgets.js b/docs/navbar-widgets.js new file mode 100644 index 0000000..8d270c4 --- /dev/null +++ b/docs/navbar-widgets.js @@ -0,0 +1,196 @@ +/** + * Navbar Widget Collector for Great Docs + * + * Consolidates all right-side navbar widgets (dark-mode toggle, keyboard + * shortcuts button, GitHub icon/widget, and search) into a single flex + * container (#gd-navbar-widgets) placed inside .quarto-navbar-tools. + * + * This guarantees uniform spacing (via CSS gap) and a predictable order + * regardless of which widgets are enabled or the order scripts execute. + * + * Must be loaded AFTER the individual widget scripts (dark-mode-toggle.js, + * keyboard-nav.js, github-widget.js) and is included unconditionally. + */ +(function () { + 'use strict'; + + function ensureWrapper(containerFluid) { + var wrapper = document.getElementById('gd-navbar-widgets'); + if (wrapper) return wrapper; + + wrapper = document.createElement('div'); + wrapper.id = 'gd-navbar-widgets'; + + var tools = containerFluid.querySelector('.quarto-navbar-tools'); + if (tools) { + tools.appendChild(wrapper); + } else { + containerFluid.appendChild(wrapper); + } + + return wrapper; + } + + function moveToWrapper(wrapper, el) { + if (!el || wrapper.contains(el)) return; + wrapper.appendChild(el); + } + + function collect() { + var containerFluid = document.querySelector('.navbar .container-fluid'); + if (!containerFluid) return; + + var wrapper = ensureWrapper(containerFluid); + + // 1. Dark-mode toggle (unwrap from its
  • ) + var toggleContainer = document.getElementById('dark-mode-toggle-container'); + if (toggleContainer) { + var li = toggleContainer.closest('li.nav-item'); + moveToWrapper(wrapper, toggleContainer); + if (li && !li.hasChildNodes()) li.remove(); + } + + // 2. Keyboard shortcuts button (unwrap from its
  • ) + var kbContainer = document.getElementById('gd-keyboard-btn-container'); + if (kbContainer) { + var kbLi = kbContainer.closest('li.nav-item'); + moveToWrapper(wrapper, kbContainer); + if (kbLi && !kbLi.hasChildNodes()) kbLi.remove(); + } + + // 3. GitHub icon β€” compact nav-item (unwrap the from its
  • ) + var compactItem = containerFluid.querySelector( + '#navbarCollapse .nav-item.compact' + ); + if (compactItem) { + var link = compactItem.querySelector('.nav-link'); + if (link) { + link.classList.add('gd-navbar-icon'); + moveToWrapper(wrapper, link); + compactItem.remove(); + } + } + + // 4. GitHub widget β€” #github-widget (unwrap from its
  • ) + var ghWidget = document.getElementById('github-widget'); + if (ghWidget) { + var ghLi = ghWidget.closest('li.nav-item'); + moveToWrapper(wrapper, ghWidget); + if (ghLi && !ghLi.hasChildNodes()) ghLi.remove(); + } + + // 4b. Version selector β€” #gd-version-selector + var vsWidget = document.getElementById('gd-version-selector'); + if (vsWidget) { + moveToWrapper(wrapper, vsWidget); + } + + // 5. Search button + var search = document.getElementById('quarto-search'); + if (search) moveToWrapper(wrapper, search); + + // Clean up the now-empty ul.ms-auto + var msAuto = containerFluid.querySelector( + '#navbarCollapse .navbar-nav.ms-auto' + ); + if (msAuto) { + Array.prototype.forEach.call( + msAuto.querySelectorAll('li.nav-item'), + function (li) { + if ( + !li.textContent.trim() && + !li.querySelector('button, input, img, svg') + ) { + li.remove(); + } + } + ); + if (msAuto.children.length === 0) msAuto.remove(); + } + } + + function init() { + collect(); + + // Re-collect when widgets are injected after DOMContentLoaded + var scheduled = false; + function scheduleCollect() { + if (scheduled) return; + scheduled = true; + requestAnimationFrame(function () { + scheduled = false; + collect(); + }); + } + + var navbarCollapse = document.getElementById('navbarCollapse'); + if (navbarCollapse) { + var observer = new MutationObserver(scheduleCollect); + observer.observe(navbarCollapse, { childList: true, subtree: true }); + } + + // Also watch container-fluid for widgets appended outside navbarCollapse + // (e.g. version selector) + var containerFluid = document.querySelector('.navbar .container-fluid'); + if (containerFluid) { + var cfObserver = new MutationObserver(scheduleCollect); + cfObserver.observe(containerFluid, { childList: true }); + } + + window.addEventListener('load', scheduleCollect, { once: true }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); + +/** + * Mobile sidebar toggle β†’ menu overlay redirect. + * + * On mobile (< 992px) the sidebar toggle button in the Title Bar + * (.quarto-btn-toggle) opens the polished menu overlay (same as the + * 'm'/'n' keyboard shortcut) instead of Bootstrap's collapse sidebar. + * This gives a smooth fade-in/slide, rounded card, backdrop blur, and + * auto-scroll to the current page β€” matching the desktop overlay UX. + */ +(function () { + "use strict"; + + var mql = window.matchMedia("(max-width: 991.98px)"); + + function intercept(e) { + if (!mql.matches) return; // desktop β€” let Bootstrap handle it + if (!window.__gdMenu) return; // keyboard-nav.js not loaded yet + + // Stop Bootstrap collapse and Quarto headroom toggle + e.preventDefault(); + e.stopPropagation(); + + if (window.__gdMenu.isOpen()) { + window.__gdMenu.hide(); + } else { + window.__gdMenu.show(); + } + } + + function attach() { + // The secondary-nav has two clickable elements: the + +
    +
    +
  • + + + + +
    + + +
    + + + +
    + +
    +
    +

    closed_range()

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

    Creates a closed range that allows you to specify a case

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    closed_range(
    +    start,
    +    stop,
    +    step=1,
    +)
    +
    +
    +

    from [start, stop] inclusively.

    +
        with switch(value) as s:
    +        s.case(closed_range(1, 5), lambda: "1-to-5")
    +        s.case(closed_range(6, 7), lambda: "6")
    +        s.default(lambda: 'default')
    +
    +
    +

    Parameters

    +
    +
    +
    start: int
    +
    +

    The inclusive lower bound of the range [start, stop].

    +
    +
    stop: int
    +
    +

    The inclusive upper bound of the range [start, stop].

    +
    +
    step=1
    +
    +The step size between elements (defaults to 1). +
    +
    +
    +
    +
    +

    Returns

    +
    +
    +
    range
    +
    +A range() generator that has a closed upper bound. +
    +
    +
    + + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/closed_range.md b/docs/reference/closed_range.md new file mode 100644 index 0000000..dee11b3 --- /dev/null +++ b/docs/reference/closed_range.md @@ -0,0 +1,43 @@ +## closed_range() + + +Creates a closed range that allows you to specify a case + + +Usage + +``` python +closed_range( + start, + stop, + step=1, +) +``` + + +from \[start, stop\] inclusively. + + with switch(value) as s: + s.case(closed_range(1, 5), lambda: "1-to-5") + s.case(closed_range(6, 7), lambda: "6") + s.default(lambda: 'default') + + +## Parameters + + +`start: int` +The inclusive lower bound of the range \[start, stop\]. + +`stop: int` +The inclusive upper bound of the range \[start, stop\]. + +`step=``1` +The step size between elements (defaults to 1). + + +## Returns + + +`range` +A range() generator that has a closed upper bound. diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 0000000..b593677 --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,626 @@ + + + + + + + + + +Reference – switchlang | switchlang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    + +
    + + +
    + + + +
    + +
    +
    +

    Reference

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

    The switch block

    +
    +

    The context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.

    +
    +
    +
    switch
    +
    +

    switch is a module-level implementation of the switch statement for Python.

    +
    +
    +
    +
    +

    Range helpers

    +
    +

    Helpers for mapping ranges of values to a single case.

    +
    +
    +
    closed_range()
    +
    +

    Creates a closed range that allows you to specify a case

    +
    +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000..862ad74 --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,21 @@ +# Reference + + +## The switch block + + +The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. + + +[switch](switch.md#switchlang.switch) +switch is a module-level implementation of the switch statement for Python. + + +## Range helpers + + +Helpers for mapping ranges of values to a single case. + + +[closed_range()](closed_range.md#switchlang.closed_range) +Creates a closed range that allows you to specify a case diff --git a/docs/reference/switch.html b/docs/reference/switch.html new file mode 100644 index 0000000..d179607 --- /dev/null +++ b/docs/reference/switch.html @@ -0,0 +1,942 @@ + + + + + + + + + +switch – switchlang | switchlang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    + +
    + + +
    + + + +
    + +
    +
    +

    switch

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

    switch is a module-level implementation of the switch statement for Python.

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    switch()
    +
    +
    +

    See https://github.com/mikeckennedy/python-switch for full details. Copyright Michael Kennedy (https://mkennedy.codes) License: MIT

    +
    +
    +

    Attributes

    + + + + + + + + + + + + + +
    +Name + +Description +
    +result + +The value captured from the method called for a given case. +
    +
    +
    +

    result

    +
    +

    The value captured from the method called for a given case.

    +
    +
    +

    result

    +
    +
    +
        value = 4
    +    with switch(value) as s:
    +        s.case(closed_range(1, 5), lambda: "1-to-5")
    +        # ...
    +
    +    res = s.result  # res == '1-to-5'
    +
    +
    +
    +
    +

    Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Name + +Description +
    +__enter__() + +Enter the switch block. +
    +__exit__() + +Run the matched case (and any fall-through cases) as the block exits. +
    +__init__() + +Create a new switch block that tests cases against value. +
    +case() + +Specify a case for the switch block: +
    +default() + +Use as option final statement in switch block. +
    +
    +
    +

    __enter__()

    +
    +

    Enter the switch block.

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    __enter__()
    +
    +
    +
    Returns
    +
    +
    +
    +
    +The switch instance itself (bind it with as s to register cases). +
    +
    +
    +
    +
    +
    +
    +

    __exit__()

    +
    +

    Run the matched case (and any fall-through cases) as the block exits.

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    __exit__(exc_type, exc_val, exc_tb)
    +
    +
    +
    Raises
    +
    +
    +
    Exception
    +
    +If no case matched the value and no default case was registered. +
    +
    +
    +
    +
    +
    +
    +

    __init__()

    +
    +

    Create a new switch block that tests cases against value.

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    __init__(value)
    +
    +
    +
    Parameters
    +
    +
    +
    value: typing.Any
    +
    +The value each case key is compared against. +
    +
    +
    +
    +
    +
    +
    +

    case()

    +
    +

    Specify a case for the switch block:

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    case(key, func, fallthrough=False)
    +
    +
    +
        with switch(val) as s:
    +       s.case('a', function)
    +       s.case('b', function, fallthrough=True)
    +       s.default(function)
    +
    +
    +
    Parameters
    +
    +
    +
    key: typing.Any
    +
    +

    Key for the case test (if this is a list or range, the items will each be added as a case)

    +
    +
    func: typing.Callable[[], typing.Any]
    +
    +

    Any callable taking no parameters to be executed if this case matches.

    +
    +
    fallthrough: typing.Optional[bool] = False
    +
    +Optionally fall through to the subsequent case (defaults to False) +
    +
    +
    +
    +
    +
    Returns
    +
    +
    +
    +
    +True if this case matched the switch value, otherwise None. +
    +
    +
    +
    +
    +
    +
    +

    default()

    +
    +

    Use as option final statement in switch block.

    +
    +
    +

    Usage

    +

    Source

    +
    +
    +
    default(func)
    +
    +
    +
        with switch(val) as s:
    +       s.case(...)
    +       s.case(...)
    +       s.default(function)
    +
    +
    +
    Parameters
    +
    +
    +
    func: typing.Callable[[], typing.Any]
    +
    +Any callable taking no parameters to be executed if this (default) case matches. +
    +
    +
    +
    +
    +
    Returns
    +
    +
    +
    +
    +None +
    +
    +
    + + +
    +
    +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/reference/switch.md b/docs/reference/switch.md new file mode 100644 index 0000000..dffeb13 --- /dev/null +++ b/docs/reference/switch.md @@ -0,0 +1,194 @@ +## switch + + +switch is a module-level implementation of the switch statement for Python. + + +Usage + +``` python +switch() +``` + + +See https://github.com/mikeckennedy/python-switch for full details. Copyright Michael Kennedy (https://mkennedy.codes) License: MIT + + +## Attributes + +| Name | Description | +|----|----| +| [result](#result) | The value captured from the method called for a given case. | + +------------------------------------------------------------------------ + + +#### result + + +The value captured from the method called for a given case. + + +`result` + + + value = 4 + with switch(value) as s: + s.case(closed_range(1, 5), lambda: "1-to-5") + # ... + + res = s.result # res == '1-to-5' + + +## Methods + +| Name | Description | +|----|----| +| [__enter__()](#__enter__) | Enter the switch block. | +| [__exit__()](#__exit__) | Run the matched case (and any fall-through cases) as the block exits. | +| [__init__()](#__init__) | Create a new switch block that tests cases against `value`. | +| [case()](#case) | Specify a case for the switch block: | +| [default()](#default) | Use as option final statement in switch block. | + +------------------------------------------------------------------------ + + +#### \_\_enter\_\_() + + +Enter the switch block. + + +Usage + +``` python +__enter__() +``` + + +##### Returns + + +The switch instance itself (bind it with `as s` to register cases). + + +------------------------------------------------------------------------ + + +#### \_\_exit\_\_() + + +Run the matched case (and any fall-through cases) as the block exits. + + +Usage + +``` python +__exit__(exc_type, exc_val, exc_tb) +``` + + +##### Raises + + +`Exception` +If no case matched the value and no default case was registered. + + +------------------------------------------------------------------------ + + +#### \_\_init\_\_() + + +Create a new switch block that tests cases against `value`. + + +Usage + +``` python +__init__(value) +``` + + +##### Parameters + + +`value: typing.Any` +The value each case key is compared against. + + +------------------------------------------------------------------------ + + +#### case() + + +Specify a case for the switch block: + + +Usage + +``` python +case(key, func, fallthrough=False) +``` + + + with switch(val) as s: + s.case('a', function) + s.case('b', function, fallthrough=True) + s.default(function) + + +##### Parameters + + +`key: typing.Any` +Key for the case test (if this is a list or range, the items will each be added as a case) + +`func: typing.Callable[[], typing.Any]` +Any callable taking no parameters to be executed if this case matches. + +`fallthrough: typing.Optional[bool] = ``False` +Optionally fall through to the subsequent case (defaults to False) + + +##### Returns + + +True if this case matched the switch value, otherwise None. + + +------------------------------------------------------------------------ + + +#### default() + + +Use as option final statement in switch block. + + +Usage + +``` python +default(func) +``` + + + with switch(val) as s: + s.case(...) + s.case(...) + s.default(function) + + +##### Parameters + + +`func: typing.Callable[[], typing.Any]` +Any callable taking no parameters to be executed if this (default) case matches. + + +##### Returns + + +None diff --git a/docs/responsive-tables.js b/docs/responsive-tables.js new file mode 100644 index 0000000..e7743a7 --- /dev/null +++ b/docs/responsive-tables.js @@ -0,0 +1,346 @@ +/** + * Responsive Tables for Great Docs + * + * Enhances table display on narrow viewports with: + * - Horizontal scroll containers for wide tables + * - Touch-friendly scroll indicators + * - Consistent dark mode styling + * + * Uses double-wrapper structure for Safari compatibility: + * - Outer wrapper (.gd-table-responsive) has position:relative for indicators + * - Inner wrapper (.gd-table-scroll) has overflow-x:auto for scrolling + */ +(function () { + "use strict"; + + // Minimum width difference to consider a table "wide" + var OVERFLOW_THRESHOLD = 20; + + /** + * Wrap a table in a responsive scroll container + */ + function wrapTable(table) { + // Skip if already wrapped + if (table.closest(".gd-table-responsive")) { + return; + } + + // Skip tables inside code blocks or other special contexts + if (table.closest("pre, code, .sourceCode")) { + return; + } + + // Skip Great Tables output β€” these have their own styling and layout + if (table.classList.contains("gt_table")) { + return; + } + + // Create outer wrapper (for indicator positioning) + var outerWrapper = document.createElement("div"); + outerWrapper.className = "gd-table-responsive"; + + // Create inner scroll container + var scrollContainer = document.createElement("div"); + scrollContainer.className = "gd-table-scroll"; + scrollContainer.setAttribute("tabindex", "0"); + scrollContainer.setAttribute("role", "region"); + scrollContainer.setAttribute("aria-label", "Scrollable table"); + + // Insert outer wrapper and move table inside inner container + table.parentNode.insertBefore(outerWrapper, table); + scrollContainer.appendChild(table); + outerWrapper.appendChild(scrollContainer); + + // Add scroll indicators to outer wrapper (not inside scroll container) + var indicatorLeft = document.createElement("div"); + indicatorLeft.className = "gd-table-scroll-indicator gd-table-scroll-left"; + indicatorLeft.innerHTML = ''; + outerWrapper.appendChild(indicatorLeft); + + var indicatorRight = document.createElement("div"); + indicatorRight.className = "gd-table-scroll-indicator gd-table-scroll-right"; + indicatorRight.innerHTML = ''; + outerWrapper.appendChild(indicatorRight); + + // Update scroll indicator visibility based on scroll position + function updateScrollIndicators() { + var scrollLeft = scrollContainer.scrollLeft; + var maxScroll = scrollContainer.scrollWidth - scrollContainer.clientWidth; + + // Only show indicators if scrollable + if (maxScroll <= OVERFLOW_THRESHOLD) { + indicatorLeft.classList.remove("visible"); + indicatorRight.classList.remove("visible"); + return; + } + + // Show/hide based on scroll position + indicatorLeft.classList.toggle("visible", scrollLeft > OVERFLOW_THRESHOLD); + indicatorRight.classList.toggle("visible", scrollLeft < maxScroll - OVERFLOW_THRESHOLD); + } + + // Debounced scroll handler + var scrollTimeout; + scrollContainer.addEventListener("scroll", function () { + if (scrollTimeout) { + clearTimeout(scrollTimeout); + } + scrollTimeout = setTimeout(updateScrollIndicators, 50); + }); + + // Click to scroll + indicatorLeft.addEventListener("click", function () { + scrollContainer.scrollBy({ left: -150, behavior: "smooth" }); + }); + + indicatorRight.addEventListener("click", function () { + scrollContainer.scrollBy({ left: 150, behavior: "smooth" }); + }); + + // Initial indicator update + setTimeout(updateScrollIndicators, 100); + + // Update on resize + var resizeObserver; + if (typeof ResizeObserver !== "undefined") { + resizeObserver = new ResizeObserver(function () { + updateScrollIndicators(); + }); + resizeObserver.observe(scrollContainer); + } + + return outerWrapper; + } + + /** + * Scale content inside a .scale-to-fit container to fill the container width. + * + * Usage in .qmd: + * :::{.scale-to-fit} + * ```{python} + * my_wide_table() + * ``` + * ::: + */ + // Viewport breakpoints for keyword-based min-scale thresholds. + // Below the given width, scaling is disabled and horizontal scrolling is + // used instead. + var SCALE_BREAKPOINTS = { mobile: 576, tablet: 768, desktop: 992 }; + + /** + * Parse a data-min-scale attribute value. + * Returns an object: { type: "number", value: 0.4 } + * or { type: "keyword", width: 768 } + * or null (no threshold). + */ + function parseMinScale(raw) { + if (!raw) return null; + var lower = raw.toLowerCase(); + if (SCALE_BREAKPOINTS[lower] !== undefined) { + return { type: "keyword", width: SCALE_BREAKPOINTS[lower] }; + } + var n = parseFloat(raw); + if (!isNaN(n) && n > 0 && n < 1) { + return { type: "number", value: n }; + } + return null; + } + + function applyScaleToFit(container, minScaleObj) { + // minScaleObj: parsed result from parseMinScale(), or null. + // Per-container data-min-scale overrides the page/global threshold. + var containerMinScale = parseMinScale(container.getAttribute("data-min-scale")); + if (containerMinScale) { + minScaleObj = containerMinScale; + } + // Find the content to scale β€” first child element that has measurable width + var inner = container.querySelector(".cell-output-display, .cell-output, table, .gt_table"); + if (!inner) { + // Fall back to first element child + inner = container.firstElementChild; + } + if (!inner) return; + + // Wrap content in a scaling div if not already wrapped + var scaleWrapper = container.querySelector(".gd-scale-wrapper"); + if (!scaleWrapper) { + scaleWrapper = document.createElement("div"); + scaleWrapper.className = "gd-scale-wrapper"; + // Move all children into the wrapper + while (container.firstChild) { + scaleWrapper.appendChild(container.firstChild); + } + container.appendChild(scaleWrapper); + } + + function updateScale() { + // Reset transform to measure natural width + scaleWrapper.style.transform = "none"; + scaleWrapper.style.transformOrigin = "top left"; + scaleWrapper.style.width = "max-content"; + scaleWrapper.style.height = ""; + container.style.height = ""; + + // Allow layout to settle + var containerWidth = container.clientWidth; + var contentWidth = scaleWrapper.scrollWidth; + + if (contentWidth <= 0 || containerWidth <= 0) return; + + var scale = containerWidth / contentWidth; + + // Never upscale β€” only shrink to fit + if (scale >= 1) { + scaleWrapper.style.transform = "none"; + scaleWrapper.style.width = ""; + scaleWrapper.style.height = ""; + container.style.height = ""; + container.style.overflow = ""; + container.classList.remove("gd-scale-scrollable"); + return; + } + + // Check whether we should skip scaling and scroll instead. + // Keyword thresholds: if viewport is at or below the breakpoint, scroll. + // Numeric thresholds: if computed scale < min, scroll. + var shouldScroll = false; + if (minScaleObj) { + if (minScaleObj.type === "keyword") { + shouldScroll = window.innerWidth <= minScaleObj.width; + } else if (minScaleObj.type === "number") { + shouldScroll = scale < minScaleObj.value; + } + } + + if (shouldScroll) { + scaleWrapper.style.transform = "none"; + scaleWrapper.style.width = "max-content"; + scaleWrapper.style.height = ""; + container.style.height = ""; + container.style.overflowX = "auto"; + container.classList.add("gd-scale-scrollable"); + return; + } + + // Apply scale + scaleWrapper.style.transform = "scale(" + scale + ")"; + scaleWrapper.style.width = contentWidth + "px"; + + // Adjust container height to match scaled content + var contentHeight = scaleWrapper.scrollHeight; + container.style.height = (contentHeight * scale) + "px"; + container.style.overflow = "hidden"; + } + + updateScale(); + + // Re-scale on window resize + if (typeof ResizeObserver !== "undefined") { + var ro = new ResizeObserver(function () { + updateScale(); + }); + ro.observe(container); + } + } + + /** + * Initialize responsive tables + */ + function init() { + // Find all tables in the content area + var content = document.querySelector("#quarto-content, .content, main, article"); + if (!content) { + content = document.body; + } + + var tables = content.querySelectorAll("table"); + for (var i = 0; i < tables.length; i++) { + wrapTable(tables[i]); + } + + // Apply scale-to-fit to marked containers (manual :::{.scale-to-fit}) + var fitContainers = content.querySelectorAll(".scale-to-fit"); + for (var i = 0; i < fitContainers.length; i++) { + applyScaleToFit(fitContainers[i]); + } + + // Auto-scale elements matching CSS selectors from config or page frontmatter. + // Global selectors come from: + // Page-level selectors come from: + // Both may carry data-min-scale (float like "0.4" or keyword like "tablet"). + var allSelectors = []; + var minScaleObj = null; + var globalMeta = document.querySelector('meta[name="gd-scale-to-fit"]'); + var pageMeta = document.querySelector('meta[name="gd-scale-to-fit-page"]'); + + // Page-level takes precedence over global for both selectors and min-scale + var activeMeta = pageMeta || globalMeta; + if (activeMeta) { + try { allSelectors = JSON.parse(activeMeta.getAttribute("data-selectors") || "[]"); } catch (e) { /* ignore */ } + minScaleObj = parseMinScale(activeMeta.getAttribute("data-min-scale")); + // If page meta didn't specify min-scale, fall back to global meta + if (!minScaleObj && pageMeta && globalMeta && pageMeta !== globalMeta) { + minScaleObj = parseMinScale(globalMeta.getAttribute("data-min-scale")); + } + } + + // Also pass minScaleObj to manual .scale-to-fit containers + for (var i = 0; i < fitContainers.length; i++) { + // Re-apply with minScaleObj if we have one (first call was with null) + if (minScaleObj) { applyScaleToFit(fitContainers[i], minScaleObj); } + } + + for (var si = 0; si < allSelectors.length; si++) { + var selector = allSelectors[si]; + var matches; + try { matches = content.querySelectorAll(selector); } catch (e) { continue; } + + for (var mi = 0; mi < matches.length; mi++) { + var el = matches[mi]; + // Walk up to the nearest output container to scale + var scaleTarget = el.closest(".cell-output-display") || el.closest(".cell-output") || el.parentElement; + if (scaleTarget && !scaleTarget.classList.contains("scale-to-fit")) { + scaleTarget.classList.add("scale-to-fit"); + applyScaleToFit(scaleTarget, minScaleObj); + } + } + } + + // Handle dynamically added tables (e.g., from AJAX) + if (typeof MutationObserver !== "undefined") { + var observer = new MutationObserver(function (mutations) { + for (var i = 0; i < mutations.length; i++) { + var mutation = mutations[i]; + for (var j = 0; j < mutation.addedNodes.length; j++) { + var node = mutation.addedNodes[j]; + if (node.nodeType === 1) { + // Element node + if (node.tagName === "TABLE") { + wrapTable(node); + } else { + var nestedTables = node.querySelectorAll + ? node.querySelectorAll("table") + : []; + for (var k = 0; k < nestedTables.length; k++) { + wrapTable(nestedTables[k]); + } + } + } + } + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + }); + } + } + + // Run after DOM is ready + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } +})(); diff --git a/docs/robots.txt b/docs/robots.txt new file mode 100644 index 0000000..34a01f7 --- /dev/null +++ b/docs/robots.txt @@ -0,0 +1,6 @@ +# Robots.txt generated by Great Docs + +User-agent: * +Allow: / + +Sitemap: https://mkennedy.codes/docs/python-switch/sitemap.xml diff --git a/docs/search.json b/docs/search.json new file mode 100644 index 0000000..eb86fdc --- /dev/null +++ b/docs/search.json @@ -0,0 +1,207 @@ +[ + { + "objectID": "reference/switch.html", + "href": "reference/switch.html", + "title": "switch", + "section": "", + "text": "switch is a module-level implementation of the switch statement for Python.", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/switch.html#result", + "href": "reference/switch.html#result", + "title": "switch", + "section": "result", + "text": "result\n\nThe value captured from the method called for a given case.\n\n\nresult\n\n\n value = 4\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n # ...\n\n res = s.result # res == '1-to-5'", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/switch.html#enter__", + "href": "reference/switch.html#enter__", + "title": "switch", + "section": "__enter__()", + "text": "__enter__()\n\nEnter the switch block.\n\n\nUsage\nSource\n\n\n__enter__()\n\n\nReturns\n\n\n\n\nThe switch instance itself (bind it with as s to register cases).", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/switch.html#exit__", + "href": "reference/switch.html#exit__", + "title": "switch", + "section": "__exit__()", + "text": "__exit__()\n\nRun the matched case (and any fall-through cases) as the block exits.\n\n\nUsage\nSource\n\n\n__exit__(exc_type, exc_val, exc_tb)\n\n\nRaises\n\n\n Exception\n\nIf no case matched the value and no default case was registered.", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/switch.html#init__", + "href": "reference/switch.html#init__", + "title": "switch", + "section": "__init__()", + "text": "__init__()\n\nCreate a new switch block that tests cases against value.\n\n\nUsage\nSource\n\n\n__init__(value)\n\n\nParameters\n\n\nvalue: typing.Any\n\nThe value each case key is compared against.", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/switch.html#case", + "href": "reference/switch.html#case", + "title": "switch", + "section": "case()", + "text": "case()\n\nSpecify a case for the switch block:\n\n\nUsage\nSource\n\n\ncase(key, func, fallthrough=False)\n\n\n with switch(val) as s:\n s.case('a', function)\n s.case('b', function, fallthrough=True)\n s.default(function)\n\n\nParameters\n\n\nkey: typing.Any\n\nKey for the case test (if this is a list or range, the items will each be added as a case)\n\nfunc: typing.Callable[[], typing.Any]\n\nAny callable taking no parameters to be executed if this case matches.\n\nfallthrough: typing.Optional[bool] = False\n\nOptionally fall through to the subsequent case (defaults to False)\n\n\n\n\n\nReturns\n\n\n\n\nTrue if this case matched the switch value, otherwise None.", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/switch.html#default", + "href": "reference/switch.html#default", + "title": "switch", + "section": "default()", + "text": "default()\n\nUse as option final statement in switch block.\n\n\nUsage\nSource\n\n\ndefault(func)\n\n\n with switch(val) as s:\n s.case(...)\n s.case(...)\n s.default(function)\n\n\nParameters\n\n\nfunc: typing.Callable[[], typing.Any]\n\nAny callable taking no parameters to be executed if this (default) case matches.\n\n\n\n\n\nReturns\n\n\n\n\nNone", + "crumbs": [ + "Reference", + "The switch block", + "[switch]{.doc-object-name .doc-class .doc-label .doc-label-class}" + ] + }, + { + "objectID": "reference/closed_range.html", + "href": "reference/closed_range.html", + "title": "closed_range()", + "section": "", + "text": "Creates a closed range that allows you to specify a case\n\n\nUsage\nSource\n\n\nclosed_range(start, stop, step=1)\n\n\nfrom [start, stop] inclusively.\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n s.case(closed_range(6, 7), lambda: \"6\")\n s.default(lambda: 'default')\n\n\nParameters\n\n\nstart: int\n\nThe inclusive lower bound of the range [start, stop].\n\nstop: int\n\nThe inclusive upper bound of the range [start, stop].\n\nstep=1\n\nThe step size between elements (defaults to 1).\n\n\n\n\n\nReturns\n\n\n range\n\nA range() generator that has a closed upper bound.", + "crumbs": [ + "Reference", + "Range helpers", + "[closed_range()]{.doc-object-name .doc-function .doc-label .doc-label-function}" + ] + }, + { + "objectID": "skills.html", + "href": "skills.html", + "title": "Skills", + "section": "", + "text": "A skill is a package of structured files that teaches an AI coding agent how to work with a specific tool or framework. The skill below was generated by Great Docs from this project’s documentation. Install it in your agent and it will be able to run commands, edit configuration, write content, and troubleshoot problems without step-by-step guidance from you.\n\n \n β–Ά Install this skill\n \n \n \n \nAny agent β€” install with npx:\nnpx skills add https://mkennedy.codes/docs/python-switch/\nCodex / OpenCode\nTell the agent:Fetch the skill file at https://mkennedy.codes/docs/python-switch/skill.md and follow the instructions.\nManual β€” download the skill file:\ncurl -O https://mkennedy.codes/docs/python-switch/skill.md\nOr browse the SKILL.md file.\n \n \n \n\n\nSKILL.md\n---\nname: switchlang\ndescription: >\n Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package.\nlicense: MIT\ncompatibility: Requires Python >=3.9.\n---\n\n# switchlang\n\nAdds switch blocks to the Python language.\n\n## Installation\n\n```bash\npip install switchlang\n```\n\n## API overview\n\n### The switch block\n\nThe context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`.\n\n\n- `switch`: switch is a module-level implementation of the switch statement for Python\n\n### Range helpers\n\nHelpers for mapping ranges of values to a single case.\n\n\n- `closed_range`: Creates a closed range that allows you to specify a case\n\n## Resources\n\n- [Full documentation](https://mkennedy.codes/docs/python-switch/)\n- [llms.txt](llms.txt) β€” Indexed API reference for LLMs\n- [llms-full.txt](llms-full.txt) β€” Comprehensive documentation for LLMs\n- [Source code](https://github.com/mikeckennedy/python-switch)" + }, + { + "objectID": "changelog.html", + "href": "changelog.html", + "title": "Changelog", + "section": "", + "text": "This changelog is generated automatically from GitHub Releases.\n\nv0.1.1\n2025-09-11 Β· GitHub\nRefactor codebase for consistent double‑quoted strings and add type hints\nThis update replaces single‑quoted literals with double quotes throughout the repository, standardizes string formatting in setup.py, __init__.py, and test files, and introduces comprehensive type annotations to improve readability and static analysis support. The changes also clean up import statements, adjust exception messages for clarity, and ensure the package metadata uses consistent quoting conventions. πŸš€\nSolves potential type warning on s.result." + }, + { + "objectID": "index.html", + "href": "index.html", + "title": "switchlang", + "section": "", + "text": "View on PyPI Browse source code Issues Pypi Funding\n\n\n\nSkills llms.txt llms-full.txt\n\n\n\n\n\n\nMichael Kennedy\n\n\n\nAuthor\n\n \n\n\n\n\nFull license MIT\n\n\n\nRequires: Python >=3.9 Provides-Extra: dev" + }, + { + "objectID": "index.html#example", + "href": "index.html#example", + "title": "switchlang", + "section": "Example", + "text": "Example\nfrom switchlang import switch\n\ndef main():\n num = 7\n val = input(\"Enter a character, a, b, c or any other: \")\n\n with switch(val) as s:\n s.case('a', process_a)\n s.case('b', lambda: process_with_data(val, num, 'other values still'))\n s.default(process_any)\n \ndef process_a():\n print(\"Found A!\")\n \ndef process_any():\n print(\"Found Default!\")\n \ndef process_with_data(*value):\n print(\"Found with data: {}\".format(value))\n\nmain()" + }, + { + "objectID": "index.html#installation", + "href": "index.html#installation", + "title": "switchlang", + "section": "Installation", + "text": "Installation\nSimply install via pip:\npip install switchlang" + }, + { + "objectID": "index.html#features", + "href": "index.html#features", + "title": "switchlang", + "section": "Features", + "text": "Features\n\nMore explicit than using dictionaries with functions as values.\nVerifies the signatures of the methods\nSupports default case\nChecks for duplicate keys / cases\nKeys can be anything hashable (numbers, strings, objects, etc.)\nSupports β€œfall-through” cases (opt-in with fallthrough=True)\nUse range and list for multiple cases mapped to a single action" + }, + { + "objectID": "index.html#multiple-cases-one-action", + "href": "index.html#multiple-cases-one-action", + "title": "switchlang", + "section": "Multiple cases, one action", + "text": "Multiple cases, one action\nYou can map ranges and lists of cases to a single action as follows:\n## with lists:\nvalue = 4 # matches even number case\n\nwith switch(value) as s:\n s.case([1, 3, 5, 7], lambda: ...)\n s.case([0, 2, 4, 6, 8], lambda: ...)\n s.default(lambda: ...)\n## with ranges:\nvalue = 4 # matches first case\n\nwith switch(value) as s:\n s.case(range(1, 6), lambda: ...)\n s.case(range(6, 10), lambda: ...)\n s.default(lambda: ...)" + }, + { + "objectID": "index.html#closed-vs.-open-ranges", + "href": "index.html#closed-vs.-open-ranges", + "title": "switchlang", + "section": "Closed vs.Β Open ranges", + "text": "Closed vs.Β Open ranges\nLooking at the above code it’s a bit weird that 6 appears at the end of one case, beginning of the next. But range() is half open/closed.\nTo handle the inclusive case, I’ve added closed_range(start, stop). For example, closed_range(1,5) -> [1,2,3,4,5]" + }, + { + "objectID": "index.html#why-not-just-raw-dict", + "href": "index.html#why-not-just-raw-dict", + "title": "switchlang", + "section": "Why not just raw dict?", + "text": "Why not just raw dict?\nThe biggest push back on this idea is that we already have this problem solved. You write the following code.\nswitch = {\n 1: method_on_one,\n 2: method_on_two,\n 3: method_three\n}\n\nresult = switch.get(value, default_method_to_run)()\nThis works but is very low on the functionality level. We have a better solution here I believe. Let’s take this example and see how it looks in python-switch vs raw dicts:\n## with python-switch:\n\nwhile True:\n action = get_action(action)\n\n with switch(action) as s:\n s.case(['c', 'a'], create_account)\n s.case('l', log_into_account)\n s.case('r', register_cage)\n s.case('u', update_availability)\n s.case(['v', 'b'], view_bookings)\n s.case('x', exit_app)\n s.case('', lambda: None)\n s.case(range(1,6), lambda: set_level(action))\n s.default(unknown_command)\n \n print('Result is {}'.format(s.result))\nNow compare that to the espoused pythonic way:\n## with raw dicts\n\nwhile True:\n action = get_action(action)\n\n switch = {\n 'c': create_account,\n 'a': create_account,\n 'l': log_into_account,\n 'r': register_cage,\n 'u': update_availability,\n 'v': view_bookings,\n 'b': view_bookings,\n 'x': exit_app,\n 1: lambda: set_level(action),\n 2: lambda: set_level(action),\n 3: lambda: set_level(action),\n 4: lambda: set_level(action),\n 5: lambda: set_level(action),\n '': lambda: None,\n }\n result = switch.get(action, unknown_command)()\n print('Result is {}'.format(result))\nPersonally, I much prefer to read and write the one above. That’s why I wrote this module. It seems to convey the intent of switch way more than the dict. But either are options." + }, + { + "objectID": "index.html#why-not-just-if-elif-else", + "href": "index.html#why-not-just-if-elif-else", + "title": "switchlang", + "section": "Why not just if / elif / else?", + "text": "Why not just if / elif / else?\nAnother push back on this idea is that we already have this problem solved. Switch statements are really if / elif / else blocks. So you write the following code.\n## with if / elif / else\n\nwhile True:\n action = get_action(action)\n\n if action == 'c' or action == 'a':\n result = create_account()\n elif action == 'l':\n result = log_into_account()\n elif action == 'r':\n result = register_cage()\n elif action == 'a':\n result = update_availability()\n elif action == 'v' or action == 'b':\n result = view_bookings()\n elif action == 'x':\n result = exit_app()\n elif action in {1, 2, 3, 4, 5}:\n result = set_level(action)\n else:\n unknown_command()\n \n print('Result is {}'.format(result))\nI actually believe this is a little better than the raw dict option. But there are still things that are harder.\n\nHow would you deal with fall-through cleanly?\nDid you notice the bug? We forgot to set result in default case (else) and will result in a runtime error (but only if that case hits).\nThere is another bug. update_availability will never run because its command (a) is bound to two cases. This is guarded against in switch and you would receive a duplicate case error the first time it runs at all.\nWhile it’s pretty clear, it’s much more verbose and less declarative than the switch version.\n\nAgain, compare the if / elif / else to what you have with switch. This code is identical except doesn’t have the default case bug.\nwhile True:\n action = get_action(action)\n\n with switch(action) as s:\n s.case(['c', 'a'], create_account)\n s.case('l', log_into_account)\n s.case('r', register_cage)\n s.case('u', update_availability)\n s.case(['v', 'b'], view_bookings)\n s.case('x', exit_app)\n s.case('', lambda: None)\n s.case(range(1,6), lambda: set_level(action))\n s.default(unknown_command)\n \n print('Result is {}'.format(s.result))" + }, + { + "objectID": "skill.html", + "href": "skill.html", + "title": "switchlang", + "section": "", + "text": "Adds switch blocks to the Python language." + }, + { + "objectID": "skill.html#the-switch-block", + "href": "skill.html#the-switch-block", + "title": "switchlang", + "section": "The switch block", + "text": "The switch block\nThe context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.\n\nswitch: switch is a module-level implementation of the switch statement for Python" + }, + { + "objectID": "skill.html#range-helpers", + "href": "skill.html#range-helpers", + "title": "switchlang", + "section": "Range helpers", + "text": "Range helpers\nHelpers for mapping ranges of values to a single case.\n\nclosed_range: Creates a closed range that allows you to specify a case" + }, + { + "objectID": "license.html", + "href": "license.html", + "title": "License", + "section": "", + "text": "β–Ά\n License features β€” MIT License\n\n\n\n\n\nPermissions\n\nCommercial use\nModification\nDistribution\nPrivate use\n\n\nConditions\n\nLicense and copyright notice\n\n\nLimitations\n\nLiability\nWarranty\n\n\n\n\nMIT License\n\nCopyright (c) 2017 Michael Kennedy\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE." + }, + { + "objectID": "reference/index.html", + "href": "reference/index.html", + "title": "Reference", + "section": "", + "text": "The switch block\n\nThe context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.\n\n\nswitch\n\nswitch is a module-level implementation of the switch statement for Python.\n\n\n\n\nRange helpers\n\nHelpers for mapping ranges of values to a single case.\n\n\nclosed_range()\n\nCreates a closed range that allows you to specify a case", + "crumbs": [ + "Reference", + "API Index" + ] + } +] \ No newline at end of file diff --git a/docs/sidebar-filter.js b/docs/sidebar-filter.js new file mode 100644 index 0000000..349a1e0 --- /dev/null +++ b/docs/sidebar-filter.js @@ -0,0 +1,295 @@ +/** + * Sidebar Filter for Great Docs + * + * Adds a search/filter input to the API reference sidebar for quickly + * finding items in large APIs. Automatically enabled when there are + * 20+ items in the sidebar (configurable via data attribute). + */ + +(function() { + 'use strict'; + + // Configuration + const DEFAULT_MIN_ITEMS = 20; + const DEBOUNCE_DELAY = 150; + + /** + * Debounce function to limit filter execution rate + */ + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + /** + * Count total sidebar items (links to API reference pages) + */ + function countSidebarItems(sidebar) { + const items = sidebar.querySelectorAll('.sidebar-item:not(.sidebar-item-section) .sidebar-link'); + return items.length; + } + + /** + * Create the filter input element + */ + function createFilterInput() { + const container = document.createElement('div'); + container.className = 'sidebar-filter-container'; + container.innerHTML = ` + + + `; + return container; + } + + /** + * Check if a sidebar item is a top-level navigation link (not inside a section) + * These should not be filtered (e.g., "API" link) + */ + function isTopLevelNavItem(item) { + // Items inside a section (sidebar-item-section) are NOT top-level + // Check if any ancestor is a sidebar-item-section + let parent = item.parentElement; + while (parent) { + if (parent.classList && parent.classList.contains('sidebar-item-section')) { + return false; // Inside a section, so not top-level + } + if (parent.classList && parent.classList.contains('sidebar-menu-container')) { + break; // Reached the top of the sidebar + } + parent = parent.parentElement; + } + + // This item is directly in the main sidebar list (not inside any section) + return true; + } + + /** + * Check if we're on an API reference page (where the filter should show). + * Returns true only for /reference/ pages that are NOT CLI reference pages. + */ + function isApiReferencePage() { + const path = window.location.pathname; + return path.includes('/reference/') && !path.includes('/reference/cli/'); + } + + /** + * Filter sidebar items based on search query + */ + function filterSidebar(query, sidebar, countDisplay) { + const normalizedQuery = query.toLowerCase().trim(); + const sections = sidebar.querySelectorAll('.sidebar-item-section'); + const allItems = sidebar.querySelectorAll('.sidebar-item:not(.sidebar-item-section)'); + + // Separate top-level nav items from filterable items + const topLevelNavItems = []; + const filterableItems = []; + + allItems.forEach(item => { + if (isTopLevelNavItem(item)) { + topLevelNavItems.push(item); + } else { + filterableItems.push(item); + } + }); + + let visibleCount = 0; + const totalCount = filterableItems.length; + + // If query is empty, show everything + if (!normalizedQuery) { + filterableItems.forEach(item => { + item.style.display = ''; + item.classList.remove('sidebar-filter-match'); + }); + sections.forEach(section => { + section.style.display = ''; + // Restore original collapse state + const collapseTarget = section.querySelector('.sidebar-section'); + if (collapseTarget && !collapseTarget.classList.contains('show')) { + // Keep collapsed sections collapsed + } + }); + // Top-level nav items are always visible + topLevelNavItems.forEach(item => { + item.style.display = ''; + }); + countDisplay.style.display = 'none'; + return; + } + + // Filter items (excluding top-level nav items which are always visible) + filterableItems.forEach(item => { + const link = item.querySelector('.sidebar-link'); + const text = link ? link.textContent.toLowerCase() : ''; + const matches = text.includes(normalizedQuery); + + item.style.display = matches ? '' : 'none'; + item.classList.toggle('sidebar-filter-match', matches); + + if (matches) { + visibleCount++; + } + }); + + // Show/hide sections based on whether they have visible items + sections.forEach(section => { + const sectionItems = section.querySelectorAll('.sidebar-item:not(.sidebar-item-section)'); + const hasVisibleItems = Array.from(sectionItems).some( + item => item.style.display !== 'none' + ); + + section.style.display = hasVisibleItems ? '' : 'none'; + + // Expand sections that have matches + if (hasVisibleItems) { + const collapseTarget = section.querySelector('.sidebar-section'); + if (collapseTarget && !collapseTarget.classList.contains('show')) { + collapseTarget.classList.add('show'); + } + } + }); + + // Update count display + const countNum = countDisplay.querySelector('.filter-count-num'); + const countTotal = countDisplay.querySelector('.filter-count-total'); + countNum.textContent = visibleCount; + countTotal.textContent = totalCount; + countDisplay.style.display = ''; + } + + /** + * Initialize the sidebar filter + */ + function initSidebarFilter() { + // Only show filter on API reference pages + if (!isApiReferencePage()) { + return; + } + + // Find the sidebar + const sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) { + return; + } + + // Check if we're on a reference page (has sidebar with API items) + const sidebarMenu = sidebar.querySelector('.sidebar-menu-container'); + if (!sidebarMenu) { + return; + } + + // Get minimum items threshold from data attribute or use default + const minItems = parseInt( + document.body.dataset.sidebarFilterMinItems || DEFAULT_MIN_ITEMS, + 10 + ); + + // Check if filtering is disabled + if (document.body.dataset.sidebarFilterDisabled === 'true') { + return; + } + + // Count items and check threshold + const itemCount = countSidebarItems(sidebar); + if (itemCount < minItems) { + return; + } + + // Create and insert the filter input + const filterContainer = createFilterInput(); + const menuContainer = sidebar.querySelector('.sidebar-menu-container'); + menuContainer.insertBefore(filterContainer, menuContainer.firstChild); + + // Get references to elements + const input = filterContainer.querySelector('.sidebar-filter-input'); + const clearBtn = filterContainer.querySelector('.sidebar-filter-clear'); + const countDisplay = filterContainer.querySelector('.sidebar-filter-count'); + + // Set total count + const countTotal = countDisplay.querySelector('.filter-count-total'); + countTotal.textContent = itemCount; + + // Create debounced filter function + const debouncedFilter = debounce((query) => { + filterSidebar(query, sidebar, countDisplay); + }, DEBOUNCE_DELAY); + + // Event listeners + input.addEventListener('input', (e) => { + const query = e.target.value; + clearBtn.style.display = query ? '' : 'none'; + debouncedFilter(query); + }); + + clearBtn.addEventListener('click', () => { + input.value = ''; + clearBtn.style.display = 'none'; + filterSidebar('', sidebar, countDisplay); + input.focus(); + }); + + // Keyboard shortcut: Escape to clear + input.addEventListener('keydown', (e) => { + if (e.key === 'Escape') { + if (input.value) { + input.value = ''; + clearBtn.style.display = 'none'; + filterSidebar('', sidebar, countDisplay); + } else { + input.blur(); + } + } + }); + + // Global keyboard shortcut: "/" to focus filter (like GitHub) + document.addEventListener('keydown', (e) => { + // Don't trigger if user is typing in another input + if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') { + return; + } + + if (e.key === '/' && !e.ctrlKey && !e.metaKey && !e.altKey) { + e.preventDefault(); + input.focus(); + input.select(); + } + }); + + console.log(`Sidebar filter initialized (${itemCount} items)`); + } + + // Initialize when DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initSidebarFilter); + } else { + initSidebarFilter(); + } +})(); diff --git a/docs/sidebar-float.js b/docs/sidebar-float.js new file mode 100644 index 0000000..b3e3bb2 --- /dev/null +++ b/docs/sidebar-float.js @@ -0,0 +1,197 @@ +/** + * Floating Sidebar Navigation for Great Docs + * + * Transforms the default Quarto left sidebar on desktop (>= 992px) into a + * floating, pinned navigation panel with: + * - Independent scroll containment (no bleed to page body) + * - Dynamic top/bottom bounds that react to navbar and footer + * - A sticky "Pages" header label + * - Gradient + arrow scroll affordances (top & bottom) + * - Auto-scroll to the active page on load + * + * On tablet/mobile (< 992px) this script is a no-op β€” the overlay modal + * approach handles the sidebar there. + */ +(function () { + 'use strict'; + + // ── Constants ────────────────────────────────────────────── + var GAP = 12; // breathing room (px) between sidebar and navbar/footer + var FOOTER_BUFFER = 7; // extra px buffer before footer encroaches + + + // ── Media query guard ────────────────────────────────────── + var mql = window.matchMedia('(min-width: 992px)'); + + // ── State ────────────────────────────────────────────────── + var sidebar = null; // #quarto-sidebar + var menuContainer = null; // .sidebar-menu-container + var floatBody = null; // .gd-sidebar-float-body (scrollable wrapper) + var resizeObs = null; // ResizeObserver instance + var rafId = null; + var initialised = false; + + // ── Helpers ──────────────────────────────────────────────── + function getHeader() { + return document.getElementById('quarto-header'); + } + + function getFooter() { + return document.querySelector('footer.footer'); + } + + // ── Build the float structure ────────────────────────────── + function buildFloat() { + sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return false; + menuContainer = sidebar.querySelector('.sidebar-menu-container'); + if (!menuContainer) return false; + + // Scrollable body wrapper + floatBody = document.createElement('div'); + floatBody.className = 'gd-sidebar-float-body'; + + // Move the menu container inside the scroll body + floatBody.appendChild(menuContainer); + + + + // Assemble inside #quarto-sidebar + sidebar.appendChild(floatBody); + + // Mark as enhanced + sidebar.classList.add('gd-sidebar-float'); + + return true; + } + + // ── Update sidebar bounds ────────────────────────────────── + // With position:sticky, `top` sets the stick offset from the viewport top. + // We can't use `bottom` to shrink the sidebar β€” instead we compute a + // dynamic `max-height` that accounts for the navbar and footer overlap. + function updateBounds() { + if (!sidebar || !mql.matches) return; + + var header = getHeader(); + var footer = getFooter(); + var viewportH = window.innerHeight; + + var navBottom = header ? header.getBoundingClientRect().bottom : 0; + var footerTop = footer ? footer.getBoundingClientRect().top : viewportH; + + var top = Math.max(0, navBottom) + GAP; + + // Available height = viewport minus navbar minus any footer overlap minus gaps + var footerOverlap = Math.max(0, viewportH - footerTop); + var maxH = viewportH - top - footerOverlap - GAP - FOOTER_BUFFER; + + sidebar.style.top = top + 'px'; + // Always apply maxHeight so the sidebar never overflows its bounds + sidebar.style.maxHeight = Math.max(100, maxH) + 'px'; + } + + + + // ── Scroll-to-active ─────────────────────────────────────── + function scrollToActive() { + if (!floatBody) return; + var active = floatBody.querySelector('.sidebar-link.active'); + if (active) { + // Scroll only the float body β€” NOT the main page. + // scrollIntoView() would bubble up and shift the document. + requestAnimationFrame(function () { + var bodyRect = floatBody.getBoundingClientRect(); + var activeRect = active.getBoundingClientRect(); + var offset = activeRect.top - bodyRect.top - (bodyRect.height / 2) + (activeRect.height / 2); + floatBody.scrollTop += offset; + }); + } + } + + // ── rAF-throttled scroll/resize handler ──────────────────── + function onFrameUpdate() { + updateBounds(); + rafId = null; + } + + function scheduleUpdate() { + if (rafId) return; + rafId = requestAnimationFrame(onFrameUpdate); + } + + // Immediate update on resize for more responsive bounds + function onResize() { + updateBounds(); + scheduleUpdate(); // also schedule a follow-up in case layout settles + } + + // ── Teardown (for breakpoint changes) ────────────────────── + function teardown() { + if (!initialised) return; + + // Move menu container back to sidebar root + if (menuContainer && sidebar) { + sidebar.appendChild(menuContainer); + } + + // Remove added elements + + if (floatBody && floatBody.parentNode) floatBody.parentNode.removeChild(floatBody); + + sidebar.classList.remove('gd-sidebar-float'); + sidebar.style.top = ''; + sidebar.style.maxHeight = ''; + + // Remove listeners + window.removeEventListener('scroll', scheduleUpdate); + window.removeEventListener('resize', onResize); + window.removeEventListener('quarto-hrChanged', scheduleUpdate); + if (resizeObs) { + resizeObs.disconnect(); + resizeObs = null; + } + floatBody = null; + initialised = false; + } + + // ── Initialise ───────────────────────────────────────────── + function init() { + if (initialised) return; + if (!mql.matches) return; + + if (!buildFloat()) return; + + // Bind events + window.addEventListener('scroll', scheduleUpdate, { passive: true }); + window.addEventListener('resize', onResize, { passive: true }); + window.addEventListener('quarto-hrChanged', scheduleUpdate); + + // ResizeObserver for more reliable size tracking + if (typeof ResizeObserver !== 'undefined') { + resizeObs = new ResizeObserver(scheduleUpdate); + resizeObs.observe(document.documentElement); + } + + initialised = true; + + // Initial measurements + updateBounds(); + scrollToActive(); + } + + // ── Respond to breakpoint changes ────────────────────────── + mql.addEventListener('change', function () { + if (mql.matches) { + init(); + } else { + teardown(); + } + }); + + // ── Boot ─────────────────────────────────────────────────── + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); + } else { + init(); + } +})(); diff --git a/docs/sidebar-wrap.js b/docs/sidebar-wrap.js new file mode 100644 index 0000000..d383f2a --- /dev/null +++ b/docs/sidebar-wrap.js @@ -0,0 +1,162 @@ +/** + * Sidebar Smart Wrap for Great Docs + * + * Inserts (word break opportunity) elements into long sidebar item + * names so the browser can break lines at aesthetically pleasing points: + * - After dots: store.DuckDBStore β†’ break after each "." + * - After underscores: retrieve_bm25 β†’ break after "_" + * - After open paren: connect() β†’ break after "(" + * - At camelCase: DuckDBStore β†’ break before uppercase runs + * + * The tag is invisible and zero-width; the browser only uses it as a + * line-break opportunity when the text overflows its container. + */ + +(function () { + 'use strict'; + + /** + * Insert elements at smart break points in a text node. + * + * Break opportunities are placed: + * 1. After every "." (module separators) + * 2. After every "_" (snake_case boundaries) + * 3. After every "(" (before argument lists) + * 4. Before a run of uppercase letters preceded by a lowercase letter + * (camelCase β†’ camel + Case), but only when the run is followed by + * a lowercase letter (e.g. "DBStore" keeps "DB" together and breaks + * before "Store"). + * + * The regex uses zero-width look-behind/ahead so the actual characters + * are preserved in the output β€” only tags are inserted. + */ + function insertSmartBreaks(text) { + // Split text at break-opportunity points. + // The regex captures the delimiter so we can reassemble with + // after each delimiter character. + // + // Pattern pieces: + // ([._]) – capture a dot or underscore + // (\() – capture an opening paren + // (?<=[a-z])(?=[A-Z]) – zero-width camelCase boundary + // + // We use a two-pass approach because JS regex has limited support + // for look-behind in older runtimes. + + var result = document.createDocumentFragment(); + // Pattern: split around ".", "_", "(", and camelCase transitions + // Two camelCase lookarounds: + // (?<=[a-z])(?=[A-Z]) – lowercase-to-uppercase: "Duck|DB" + // (?<=[A-Z])(?=[A-Z][a-z]) – end of acronym run: "DB|Document" + var parts = text.split(/([._()])|(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/); + // Filter out empty/undefined entries produced by the regex split + var filtered = parts.filter(function (p) { return p !== undefined && p !== ''; }); + + // Merge parentheses onto preceding tokens to prevent orphan ")" or "()" + // e.g. ["directory", "(", ")"] β†’ ["directory()"] + var merged = []; + for (var i = 0; i < filtered.length; i++) { + if (filtered[i] === '(' && i + 1 < filtered.length && filtered[i + 1] === ')') { + // "()" pair: attach to preceding token + if (merged.length > 0) { + merged[merged.length - 1] += '()'; + } else { + merged.push('()'); + } + i++; // skip the ")" + } else if (filtered[i] === ')') { + // lone ")": attach to preceding token + if (merged.length > 0) { + merged[merged.length - 1] += ')'; + } else { + merged.push(')'); + } + } else { + merged.push(filtered[i]); + } + } + + // Final pass: for any token still longer than 10 characters (e.g. + // all-lowercase names with no camelCase/separator break points), + // insert a every 10 characters as a fallback. + var CHUNK = 10; + for (var i = 0; i < merged.length; i++) { + var token = merged[i]; + if (token.length > CHUNK) { + for (var c = 0; c < token.length; c += CHUNK) { + if (c > 0) { + result.appendChild(document.createElement('wbr')); + } + result.appendChild(document.createTextNode(token.slice(c, c + CHUNK))); + } + } else { + result.appendChild(document.createTextNode(token)); + } + // Insert between every pair of adjacent parts. + if (i < merged.length - 1) { + result.appendChild(document.createElement('wbr')); + } + } + return result; + } + + /** + * Process all elements inside the sidebar. + */ + function processSidebar() { + var sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return; + + var spans = sidebar.querySelectorAll('.menu-text'); + for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + var text = span.textContent; + if (!text) continue; + // Only process items that contain separator characters, camelCase / + // acronym boundaries, or are simply too long to fit without wrapping. + // Skip plain short words like "API", "Classes". + var dominated = /[._()]/.test(text) || /[a-z][A-Z]/.test(text) || /[A-Z]{2,}[a-z]/.test(text); + if (!dominated && text.length <= 10) continue; + // Replace the text content with smart-break nodes + var fragment = insertSmartBreaks(text); + span.textContent = ''; + span.appendChild(fragment); + } + } + + /** + * Disable sidebar section collapsing by stripping Bootstrap collapse + * data attributes and ensuring all sections stay expanded. + */ + function disableSidebarCollapse() { + var sidebar = document.getElementById('quarto-sidebar'); + if (!sidebar) return; + + // Remove data-bs-toggle/target from all sidebar collapse triggers + var triggers = sidebar.querySelectorAll('[data-bs-toggle="collapse"]'); + for (var i = 0; i < triggers.length; i++) { + triggers[i].removeAttribute('data-bs-toggle'); + triggers[i].removeAttribute('data-bs-target'); + triggers[i].removeAttribute('aria-expanded'); + triggers[i].removeAttribute('role'); + } + + // Ensure all collapsible sections are permanently shown + var sections = sidebar.querySelectorAll('ul.collapse.sidebar-section'); + for (var j = 0; j < sections.length; j++) { + sections[j].classList.remove('collapse'); + sections[j].classList.add('show'); + } + } + + // Run after DOM is ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', function() { + processSidebar(); + disableSidebarCollapse(); + }); + } else { + processSidebar(); + disableSidebarCollapse(); + } +})(); diff --git a/docs/site_libs/bootstrap/bootstrap-aa1552726bdd3cb78d40c93fdbd5382a.min.css b/docs/site_libs/bootstrap/bootstrap-aa1552726bdd3cb78d40c93fdbd5382a.min.css new file mode 100644 index 0000000..136c0f3 --- /dev/null +++ b/docs/site_libs/bootstrap/bootstrap-aa1552726bdd3cb78d40c93fdbd5382a.min.css @@ -0,0 +1,12 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */@import"https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap";:root,[data-bs-theme=light]{--bs-blue: #2c3e50;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #e83e8c;--bs-red: #e74c3c;--bs-orange: #fd7e14;--bs-yellow: #f39c12;--bs-green: #18bc9c;--bs-teal: #20c997;--bs-cyan: #3498db;--bs-black: #000;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #ecf0f1;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #7b8a8b;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #6c757d;--bs-primary: #2c3e50;--bs-secondary: #6c757d;--bs-success: #18bc9c;--bs-info: #3498db;--bs-warning: #f39c12;--bs-danger: #e74c3c;--bs-light: #ecf0f1;--bs-dark: #7b8a8b;--bs-default-rgb: 108, 117, 125;--bs-primary-rgb: 44, 62, 80;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 24, 188, 156;--bs-info-rgb: 52, 152, 219;--bs-warning-rgb: 243, 156, 18;--bs-danger-rgb: 231, 76, 60;--bs-light-rgb: 236, 240, 241;--bs-dark-rgb: 123, 138, 139;--bs-primary-text-emphasis: rgb(17.6, 24.8, 32);--bs-secondary-text-emphasis: rgb(43.2, 46.8, 50);--bs-success-text-emphasis: rgb(9.6, 75.2, 62.4);--bs-info-text-emphasis: rgb(20.8, 60.8, 87.6);--bs-warning-text-emphasis: rgb(97.2, 62.4, 7.2);--bs-danger-text-emphasis: rgb(92.4, 30.4, 24);--bs-light-text-emphasis: #7b8a8b;--bs-dark-text-emphasis: #7b8a8b;--bs-primary-bg-subtle: rgb(212.8, 216.4, 220);--bs-secondary-bg-subtle: rgb(225.6, 227.4, 229);--bs-success-bg-subtle: rgb(208.8, 241.6, 235.2);--bs-info-bg-subtle: rgb(214.4, 234.4, 247.8);--bs-warning-bg-subtle: rgb(252.6, 235.2, 207.6);--bs-danger-bg-subtle: rgb(250.2, 219.2, 216);--bs-light-bg-subtle: rgb(251.5, 252, 252.5);--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: rgb(170.6, 177.8, 185);--bs-secondary-border-subtle: rgb(196.2, 199.8, 203);--bs-success-border-subtle: rgb(162.6, 228.2, 215.4);--bs-info-border-subtle: rgb(173.8, 213.8, 240.6);--bs-warning-border-subtle: rgb(250.2, 215.4, 160.2);--bs-danger-border-subtle: rgb(245.4, 183.4, 177);--bs-light-border-subtle: #ecf0f1;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: Lato, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #fff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #ecf0f1;--bs-secondary-bg-rgb: 236, 240, 241;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #18bc9c;--bs-link-color-rgb: 24, 188, 156;--bs-link-decoration: underline;--bs-link-hover-color: rgb(19.2, 150.4, 124.8);--bs-link-hover-color-rgb: 19, 150, 125;--bs-code-color: #7d12ba;--bs-highlight-bg: rgb(252.6, 235.2, 207.6);--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: #dee2e6;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.25rem;--bs-border-radius-sm: 0.2em;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(44, 62, 80, 0.25);--bs-form-valid-color: #18bc9c;--bs-form-valid-border-color: #18bc9c;--bs-form-invalid-color: #e74c3c;--bs-form-invalid-border-color: #e74c3c}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #fff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: rgb(42.5, 47.5, 52.5);--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: rgb(128.4, 139.2, 150);--bs-secondary-text-emphasis: rgb(166.8, 172.2, 177);--bs-success-text-emphasis: rgb(116.4, 214.8, 195.6);--bs-info-text-emphasis: rgb(133.2, 193.2, 233.4);--bs-warning-text-emphasis: rgb(247.8, 195.6, 112.8);--bs-danger-text-emphasis: rgb(240.6, 147.6, 138);--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: rgb(8.8, 12.4, 16);--bs-secondary-bg-subtle: rgb(21.6, 23.4, 25);--bs-success-bg-subtle: rgb(4.8, 37.6, 31.2);--bs-info-bg-subtle: rgb(10.4, 30.4, 43.8);--bs-warning-bg-subtle: rgb(48.6, 31.2, 3.6);--bs-danger-bg-subtle: rgb(46.2, 15.2, 12);--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: rgb(26.4, 37.2, 48);--bs-secondary-border-subtle: rgb(64.8, 70.2, 75);--bs-success-border-subtle: rgb(14.4, 112.8, 93.6);--bs-info-border-subtle: rgb(31.2, 91.2, 131.4);--bs-warning-border-subtle: rgb(145.8, 93.6, 10.8);--bs-danger-border-subtle: rgb(138.6, 45.6, 36);--bs-light-border-subtle: #7b8a8b;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: rgb(128.4, 139.2, 150);--bs-link-hover-color: rgb(153.72, 162.36, 171);--bs-link-color-rgb: 128, 139, 150;--bs-link-hover-color-rgb: 154, 162, 171;--bs-code-color: white;--bs-border-color: #7b8a8b;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: rgb(116.4, 214.8, 195.6);--bs-form-valid-border-color: rgb(116.4, 214.8, 195.6);--bs-form-invalid-color: rgb(240.6, 147.6, 138);--bs-form-invalid-border-color: rgb(240.6, 147.6, 138)}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.275rem + 0.3vw)}@media(min-width: 1200px){h2,.h2{font-size:1.5rem}}h3,.h3{font-size:calc(1.255rem + 0.06vw)}@media(min-width: 1200px){h3,.h3{font-size:1.3rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #ecf0f1}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small,.content span.doc-label::after{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.25rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.25rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.2em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"β€”Β "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table,.doc-reference section.doc-group>dl{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #fff;--bs-table-border-color: #dee2e6;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*,.doc-reference section.doc-group>dl>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody,.doc-reference section.doc-group>dl>tbody{vertical-align:inherit}.table>thead,.doc-reference section.doc-group>dl>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*,table:not(.gt_table)>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*,table:not(.gt_table)>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #fff;--bs-table-bg: #2c3e50;--bs-table-border-color: rgb(65.1, 81.3, 97.5);--bs-table-striped-bg: rgb(54.55, 71.65, 88.75);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(65.1, 81.3, 97.5);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(59.825, 76.475, 93.125);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #fff;--bs-table-bg: #6c757d;--bs-table-border-color: rgb(122.7, 130.8, 138);--bs-table-striped-bg: rgb(115.35, 123.9, 131.5);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(122.7, 130.8, 138);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(119.025, 127.35, 134.75);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #fff;--bs-table-bg: #18bc9c;--bs-table-border-color: rgb(47.1, 194.7, 165.9);--bs-table-striped-bg: rgb(35.55, 191.35, 160.95);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(47.1, 194.7, 165.9);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(41.325, 193.025, 163.425);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #fff;--bs-table-bg: #3498db;--bs-table-border-color: rgb(72.3, 162.3, 222.6);--bs-table-striped-bg: rgb(62.15, 157.15, 220.8);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(72.3, 162.3, 222.6);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(67.225, 159.725, 221.7);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #fff;--bs-table-bg: #f39c12;--bs-table-border-color: rgb(244.2, 165.9, 41.7);--bs-table-striped-bg: rgb(243.6, 160.95, 29.85);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(244.2, 165.9, 41.7);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(243.9, 163.425, 35.775);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #fff;--bs-table-bg: #e74c3c;--bs-table-border-color: rgb(233.4, 93.9, 79.5);--bs-table-striped-bg: rgb(232.2, 84.95, 69.75);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(233.4, 93.9, 79.5);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(232.8, 89.425, 74.625);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #ecf0f1;--bs-table-border-color: rgb(212.4, 216, 216.9);--bs-table-striped-bg: rgb(224.2, 228, 228.95);--bs-table-striped-color: #000;--bs-table-active-bg: rgb(212.4, 216, 216.9);--bs-table-active-color: #000;--bs-table-hover-bg: rgb(218.3, 222, 222.925);--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #fff;--bs-table-bg: #7b8a8b;--bs-table-border-color: rgb(136.2, 149.7, 150.6);--bs-table-striped-bg: rgb(129.6, 143.85, 144.8);--bs-table-striped-color: #fff;--bs-table-active-bg: rgb(136.2, 149.7, 150.6);--bs-table-active-color: #fff;--bs-table-hover-bg: rgb(132.9, 146.775, 147.7);--bs-table-hover-color: #fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #dee2e6;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:rgb(149.5,158.5,167.5);outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#ecf0f1;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#ecf0f1}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.25rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #dee2e6;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:rgb(149.5,158.5,167.5);outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#ecf0f1}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.2em}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #fff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #dee2e6;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:rgb(149.5,158.5,167.5);outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#2c3e50;border-color:#2c3e50}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#2c3e50;border-color:#2c3e50;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28149.5, 158.5, 167.5%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(44,62,80,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:rgb(191.7,197.1,202.5)}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#2c3e50;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:rgb(191.7,197.1,202.5)}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.25rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#ecf0f1}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #dee2e6;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.2em}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#18bc9c}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#18bc9c;border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#18bc9c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#18bc9c;box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#18bc9c}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2318bc9c' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#18bc9c;box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#18bc9c}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#18bc9c}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(24,188,156,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#18bc9c}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#e74c3c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#e74c3c;border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#e74c3c;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#e74c3c}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23e74c3c' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#e74c3c;box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#e74c3c}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#e74c3c}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(231,76,60,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#e74c3c}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.25rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(91.8, 99.45, 106.25);--bs-btn-hover-border-color: rgb(86.4, 93.6, 100);--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(86.4, 93.6, 100);--bs-btn-active-border-color: rgb(81, 87.75, 93.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-primary{--bs-btn-color: #fff;--bs-btn-bg: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(37.4, 52.7, 68);--bs-btn-hover-border-color: rgb(35.2, 49.6, 64);--bs-btn-focus-shadow-rgb: 76, 91, 106;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(35.2, 49.6, 64);--bs-btn-active-border-color: rgb(33, 46.5, 60);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #2c3e50;--bs-btn-disabled-border-color: #2c3e50}.btn-secondary{--bs-btn-color: #fff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(91.8, 99.45, 106.25);--bs-btn-hover-border-color: rgb(86.4, 93.6, 100);--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(86.4, 93.6, 100);--bs-btn-active-border-color: rgb(81, 87.75, 93.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #fff;--bs-btn-bg: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(20.4, 159.8, 132.6);--bs-btn-hover-border-color: rgb(19.2, 150.4, 124.8);--bs-btn-focus-shadow-rgb: 59, 198, 171;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(19.2, 150.4, 124.8);--bs-btn-active-border-color: #128d75;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #18bc9c;--bs-btn-disabled-border-color: #18bc9c}.btn-info{--bs-btn-color: #fff;--bs-btn-bg: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(44.2, 129.2, 186.15);--bs-btn-hover-border-color: rgb(41.6, 121.6, 175.2);--bs-btn-focus-shadow-rgb: 82, 167, 224;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(41.6, 121.6, 175.2);--bs-btn-active-border-color: rgb(39, 114, 164.25);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #3498db;--bs-btn-disabled-border-color: #3498db}.btn-warning{--bs-btn-color: #fff;--bs-btn-bg: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(206.55, 132.6, 15.3);--bs-btn-hover-border-color: rgb(194.4, 124.8, 14.4);--bs-btn-focus-shadow-rgb: 245, 171, 54;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(194.4, 124.8, 14.4);--bs-btn-active-border-color: rgb(182.25, 117, 13.5);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #f39c12;--bs-btn-disabled-border-color: #f39c12}.btn-danger{--bs-btn-color: #fff;--bs-btn-bg: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(196.35, 64.6, 51);--bs-btn-hover-border-color: rgb(184.8, 60.8, 48);--bs-btn-focus-shadow-rgb: 235, 103, 89;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(184.8, 60.8, 48);--bs-btn-active-border-color: rgb(173.25, 57, 45);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #e74c3c;--bs-btn-disabled-border-color: #e74c3c}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: rgb(200.6, 204, 204.85);--bs-btn-hover-border-color: rgb(188.8, 192, 192.8);--bs-btn-focus-shadow-rgb: 201, 204, 205;--bs-btn-active-color: #000;--bs-btn-active-bg: rgb(188.8, 192, 192.8);--bs-btn-active-border-color: rgb(177, 180, 180.75);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ecf0f1;--bs-btn-disabled-border-color: #ecf0f1}.btn-dark{--bs-btn-color: #fff;--bs-btn-bg: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: rgb(142.8, 155.55, 156.4);--bs-btn-hover-border-color: rgb(136.2, 149.7, 150.6);--bs-btn-focus-shadow-rgb: 143, 156, 156;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(149.4, 161.4, 162.2);--bs-btn-active-border-color: rgb(136.2, 149.7, 150.6);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #7b8a8b;--bs-btn-disabled-border-color: #7b8a8b}.btn-outline-default{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #2c3e50;--bs-btn-border-color: #2c3e50;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #2c3e50;--bs-btn-hover-border-color: #2c3e50;--bs-btn-focus-shadow-rgb: 44, 62, 80;--bs-btn-active-color: #fff;--bs-btn-active-bg: #2c3e50;--bs-btn-active-border-color: #2c3e50;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #2c3e50;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #2c3e50;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #fff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #18bc9c;--bs-btn-border-color: #18bc9c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #18bc9c;--bs-btn-hover-border-color: #18bc9c;--bs-btn-focus-shadow-rgb: 24, 188, 156;--bs-btn-active-color: #fff;--bs-btn-active-bg: #18bc9c;--bs-btn-active-border-color: #18bc9c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #18bc9c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #18bc9c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #3498db;--bs-btn-border-color: #3498db;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #3498db;--bs-btn-hover-border-color: #3498db;--bs-btn-focus-shadow-rgb: 52, 152, 219;--bs-btn-active-color: #fff;--bs-btn-active-bg: #3498db;--bs-btn-active-border-color: #3498db;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #3498db;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #3498db;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #f39c12;--bs-btn-border-color: #f39c12;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #f39c12;--bs-btn-hover-border-color: #f39c12;--bs-btn-focus-shadow-rgb: 243, 156, 18;--bs-btn-active-color: #fff;--bs-btn-active-bg: #f39c12;--bs-btn-active-border-color: #f39c12;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f39c12;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f39c12;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #e74c3c;--bs-btn-border-color: #e74c3c;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #e74c3c;--bs-btn-hover-border-color: #e74c3c;--bs-btn-focus-shadow-rgb: 231, 76, 60;--bs-btn-active-color: #fff;--bs-btn-active-bg: #e74c3c;--bs-btn-active-border-color: #e74c3c;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #e74c3c;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #e74c3c;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #ecf0f1;--bs-btn-border-color: #ecf0f1;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ecf0f1;--bs-btn-hover-border-color: #ecf0f1;--bs-btn-focus-shadow-rgb: 236, 240, 241;--bs-btn-active-color: #000;--bs-btn-active-bg: #ecf0f1;--bs-btn-active-border-color: #ecf0f1;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ecf0f1;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ecf0f1;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #7b8a8b;--bs-btn-border-color: #7b8a8b;--bs-btn-hover-color: #fff;--bs-btn-hover-bg: #7b8a8b;--bs-btn-hover-border-color: #7b8a8b;--bs-btn-focus-shadow-rgb: 123, 138, 139;--bs-btn-active-color: #fff;--bs-btn-active-bg: #7b8a8b;--bs-btn-active-border-color: #7b8a8b;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #7b8a8b;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #7b8a8b;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #18bc9c;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: rgb(19.2, 150.4, 124.8);--bs-btn-hover-border-color: transparent;--bs-btn-active-color: rgb(19.2, 150.4, 124.8);--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 59, 198, 171;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.2em}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #fff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.25rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.25rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #7b8a8b;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-link-hover-bg: #2c3e50;--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #fff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #fff;--bs-dropdown-link-active-bg: #2c3e50;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.25rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 2rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #18bc9c;--bs-nav-link-hover-color: rgb(19.2, 150.4, 124.8);--bs-nav-link-disabled-color: #6c757d;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(44,62,80,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: #ecf0f1;--bs-nav-tabs-border-radius: 0.25rem;--bs-nav-tabs-link-hover-border-color: #ecf0f1 #ecf0f1 #ecf0f1;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #fff;--bs-nav-tabs-link-active-border-color: #dee2e6 #dee2e6 #fff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.25rem;--bs-nav-pills-link-active-color: #fff;--bs-nav-pills-link-active-bg: #2c3e50}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 1rem;--bs-navbar-color: rgb(204.36, 208.68, 213);--bs-navbar-hover-color: rgba(255, 255, 255, 0.8);--bs-navbar-disabled-color: rgba(204.36, 208.68, 213, 0.75);--bs-navbar-active-color: #fff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: rgb(204.36, 208.68, 213);--bs-navbar-brand-hover-color: #fff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28204.36, 208.68, 213%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(204.36, 208.68, 213, 0);--bs-navbar-toggler-border-radius: 0.25rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: rgb(204.36, 208.68, 213);--bs-navbar-hover-color: rgba(255, 255, 255, 0.8);--bs-navbar-disabled-color: rgba(204.36, 208.68, 213, 0.75);--bs-navbar-active-color: #fff;--bs-navbar-brand-color: rgb(204.36, 208.68, 213);--bs-navbar-brand-hover-color: #fff;--bs-navbar-toggler-border-color: rgba(204.36, 208.68, 213, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28204.36, 208.68, 213%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgb%28204.36, 208.68, 213%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.25rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.25rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(52, 58, 64, 0.25);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #fff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #fff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: #dee2e6;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.25rem;--bs-accordion-inner-border-radius: calc(0.25rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #fff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%2817.6, 24.8, 32%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: rgb(149.5, 158.5, 167.5);--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: rgb(17.6, 24.8, 32);--bs-accordion-active-bg: rgb(212.8, 216.4, 220)}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28128.4, 139.2, 150%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28128.4, 139.2, 150%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0.75rem;--bs-breadcrumb-padding-y: 0.375rem;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: 0.25rem;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #fff;--bs-pagination-bg: #18bc9c;--bs-pagination-border-width: 0;--bs-pagination-border-color: transparent;--bs-pagination-border-radius: 0.25rem;--bs-pagination-hover-color: #fff;--bs-pagination-hover-bg: rgb(15.3396226415, 120.1603773585, 99.7075471698);--bs-pagination-hover-border-color: transparent;--bs-pagination-focus-color: rgb(19.2, 150.4, 124.8);--bs-pagination-focus-bg: #ecf0f1;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-pagination-active-color: #fff;--bs-pagination-active-bg: rgb(15.3396226415, 120.1603773585, 99.7075471698);--bs-pagination-active-border-color: transparent;--bs-pagination-disabled-color: #ecf0f1;--bs-pagination-disabled-bg: rgb(58.5754716981, 229.9245283019, 196.4905660377);--bs-pagination-disabled-border-color: transparent;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(0*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.2em}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #fff;--bs-badge-border-radius: 0.25rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.25rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #ecf0f1;--bs-progress-border-radius: 0.25rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #fff;--bs-progress-bar-bg: #2c3e50;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #fff;--bs-list-group-border-color: #dee2e6;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.25rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #ecf0f1;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #ecf0f1;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ecf0f1;--bs-list-group-active-color: #fff;--bs-list-group-active-bg: #2c3e50;--bs-list-group-active-border-color: #2c3e50;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #fff;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.4;--bs-btn-close-hover-opacity: 1;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(44, 62, 80, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.25rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #fff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: #dee2e6;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: #dee2e6;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #fff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.25rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #fff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #ecf0f1;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #fff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#fff !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#fff !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#fff !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(35, 50, 64, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(35, 50, 64, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(19, 150, 125, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(19, 150, 125, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(42, 122, 175, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(42, 122, 175, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(194, 125, 14, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(194, 125, 14, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(185, 61, 48, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(185, 61, 48, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(240, 243, 244, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(240, 243, 244, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(98, 110, 111, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(98, 110, 111, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3,.doc-signature>p:first-child{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3,:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dt:not(:first-child),h5,.h5{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0,:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dd{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2,header p{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1,.doc-text dt code{padding:.25rem !important}.p-2,.doc-signature>p:first-child code{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1,span.doc-object-name:is(.doc-class-name,.doc-method-name,.doc-module-name,.doc-function-name,.doc-alias-name,.doc-attribute-name,.doc-type-name,.doc-typevar)::before{padding-right:.25rem !important;padding-left:.25rem !important}.px-2,:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dd>table td{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1,:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dd>table td{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4,section.doc-attributes>section.doc-attribute,section.doc-methods>section.doc-method{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.275rem + 0.3vw) !important}.fs-3{font-size:calc(1.255rem + 0.06vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal,.content span.doc-label::after{font-weight:400 !important}.fw-medium,h1,.h1,.h2,h2,h3,.h3{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:hsla(0,0%,100%,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#fff}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#fff}.bg-warning{color:#fff}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.5rem !important}.fs-3{font-size:1.3rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #6c757d}.bg-default{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(67.2, 43.6, 144.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(67.2,43.6,144.8);color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(70.8, 63.6, 125.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(70.8,63.6,125.2);color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(119.2, 62, 104);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(119.2,62,104);color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(118.8, 67.6, 72);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(118.8,67.6,72);color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(127.6, 87.6, 56);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(127.6,87.6,56);color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(123.6, 99.6, 55.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(123.6,99.6,55.2);color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(36, 112.4, 110.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(36,112.4,110.4);color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(39.2, 117.6, 108.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(39.2,117.6,108.4);color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(47.2, 98, 135.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(47.2,98,135.6);color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(78.8, 34.4, 177.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(78.8,34.4,177.2);color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(105.6, 36, 222.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(105.6,36,222.4);color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(154, 34.4, 201.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(154,34.4,201.2);color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(153.6, 40, 169.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(153.6,40,169.2);color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(162.4, 60, 153.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(162.4,60,153.2);color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(158.4, 72, 152.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(158.4,72,152.4);color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(70.8, 84.8, 207.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(70.8,84.8,207.6);color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(74, 90, 205.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(74,90,205.6);color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(82, 70.4, 232.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(82,70.4,232.8);color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(84.2, 64.4, 147.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(84.2,64.4,147.8);color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(107.4, 46, 212.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(107.4,46,212.6);color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(159.4, 64.4, 171.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(159.4,64.4,171.8);color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(159, 70, 139.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(159,70,139.8);color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(167.8, 90, 123.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(167.8,90,123.8);color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(163.8, 102, 123);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(163.8,102,123);color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(76.2, 114.8, 178.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(76.2,114.8,178.2);color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(79.4, 120, 176.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(79.4,120,176.2);color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(87.4, 100.4, 203.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(87.4,100.4,203.4);color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(156.8, 62, 116);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(156.8,62,116);color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(180, 43.6, 180.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(180,43.6,180.8);color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(183.6, 63.6, 161.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(183.6,63.6,161.2);color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(231.6, 67.6, 108);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(231.6,67.6,108);color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(240.4, 87.6, 92);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(240.4,87.6,92);color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(236.4, 99.6, 91.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(236.4,99.6,91.2);color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(148.8, 112.4, 146.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(148.8,112.4,146.4);color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(152, 117.6, 144.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(152,117.6,144.4);color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(160, 98, 171.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(160,98,171.6);color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(156.2, 70.4, 68);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(156.2,70.4,68);color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(179.4, 52, 132.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(179.4,52,132.8);color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(183, 72, 113.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(183,72,113.2);color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(231.4, 70.4, 92);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(231.4,70.4,92);color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(239.8, 96, 44);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(239.8,96,44);color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(235.8, 108, 43.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(235.8,108,43.2);color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(148.2, 120.8, 98.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(148.2,120.8,98.4);color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(151.4, 126, 96.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(151.4,126,96.4);color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(159.4, 106.4, 123.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(159.4,106.4,123.6);color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(169.4, 100.4, 44);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(169.4,100.4,44);color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(192.6, 82, 108.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(192.6,82,108.8);color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(196.2, 102, 89.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(196.2,102,89.2);color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(244.6, 100.4, 68);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(244.6,100.4,68);color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(244.2, 106, 36);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(244.2,106,36);color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(249, 138, 19.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(249,138,19.2);color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(161.4, 150.8, 74.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(161.4,150.8,74.4);color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(164.6, 156, 72.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(164.6,156,72.4);color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(172.6, 136.4, 99.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(172.6,136.4,99.6);color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(163.4, 118.4, 42.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(163.4,118.4,42.8);color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(186.6, 100, 107.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(186.6,100,107.6);color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(190.2, 120, 88);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(190.2,120,88);color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(238.6, 118.4, 66.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(238.6,118.4,66.8);color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(238.2, 124, 34.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(238.2,124,34.8);color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(247, 144, 18.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(247,144,18.8);color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(155.4, 168.8, 73.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(155.4,168.8,73.2);color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(158.6, 174, 71.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(158.6,174,71.2);color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(166.6, 154.4, 98.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(166.6,154.4,98.4);color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(32, 137.6, 125.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(32,137.6,125.6);color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(55.2, 119.2, 190.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(55.2,119.2,190.4);color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(58.8, 139.2, 170.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(58.8,139.2,170.8);color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(107.2, 137.6, 149.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(107.2,137.6,149.6);color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(106.8, 143.2, 117.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(106.8,143.2,117.6);color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(115.6, 163.2, 101.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(115.6,163.2,101.6);color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(111.6, 175.2, 100.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(111.6,175.2,100.8);color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(27.2, 193.2, 154);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(27.2,193.2,154);color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(35.2, 173.6, 181.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(35.2,173.6,181.2);color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(36.8, 145.4, 122.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(36.8,145.4,122.6);color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(60, 127, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(60,127,187.4);color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(63.6, 147, 167.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(63.6,147,167.8);color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(112, 145.4, 146.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(112,145.4,146.6);color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(111.6, 151, 114.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(111.6,151,114.6);color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(120.4, 171, 98.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(120.4,171,98.6);color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(116.4, 183, 97.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(116.4,183,97.8);color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(28.8, 195.8, 153);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(28.8,195.8,153);color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(40, 181.4, 178.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(40,181.4,178.2);color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(48.8, 116, 163.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(48.8,116,163.4);color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(72, 97.6, 228.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(72,97.6,228.2);color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(75.6, 117.6, 208.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(75.6,117.6,208.6);color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(124, 116, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(124,116,187.4);color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(123.6, 121.6, 155.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(123.6,121.6,155.4);color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(132.4, 141.6, 139.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(132.4,141.6,139.4);color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(128.4, 153.6, 138.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(128.4,153.6,138.6);color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(40.8, 166.4, 193.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(40.8,166.4,193.8);color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(44, 171.6, 191.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(44,171.6,191.8);color:#fff}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #2c3e50;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #e83e8c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #e83e8c;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #e74c3c;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #f39c12;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #18bc9c;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #3498db;--bslib-color-fg: #fff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #3498db;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #6c757d}.bg-default{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-primary{--bslib-color-fg: #2c3e50}.bg-primary{--bslib-color-bg: #2c3e50;--bslib-color-fg: #fff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #fff}.text-success{--bslib-color-fg: #18bc9c}.bg-success{--bslib-color-bg: #18bc9c;--bslib-color-fg: #fff}.text-info{--bslib-color-fg: #3498db}.bg-info{--bslib-color-bg: #3498db;--bslib-color-fg: #fff}.text-warning{--bslib-color-fg: #f39c12}.bg-warning{--bslib-color-bg: #f39c12;--bslib-color-fg: #fff}.text-danger{--bslib-color-fg: #e74c3c}.bg-danger{--bslib-color-bg: #e74c3c;--bslib-color-fg: #fff}.text-light{--bslib-color-fg: #ecf0f1}.bg-light{--bslib-color-bg: #ecf0f1;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #7b8a8b}.bg-dark{--bslib-color-bg: #7b8a8b;--bslib-color-fg: #fff}.bg-gradient-blue-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(67.2, 43.6, 144.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(67.2,43.6,144.8);color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(70.8, 63.6, 125.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(70.8,63.6,125.2);color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(119.2, 62, 104);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(119.2,62,104);color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(118.8, 67.6, 72);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(118.8,67.6,72);color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(127.6, 87.6, 56);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(127.6,87.6,56);color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(123.6, 99.6, 55.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(123.6,99.6,55.2);color:#fff}.bg-gradient-blue-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(36, 112.4, 110.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(36,112.4,110.4);color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(39.2, 117.6, 108.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(39.2,117.6,108.4);color:#fff}.bg-gradient-blue-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(47.2, 98, 135.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #2c3e50 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(47.2,98,135.6);color:#fff}.bg-gradient-indigo-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(78.8, 34.4, 177.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(78.8,34.4,177.2);color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(105.6, 36, 222.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(105.6,36,222.4);color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(154, 34.4, 201.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(154,34.4,201.2);color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(153.6, 40, 169.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(153.6,40,169.2);color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(162.4, 60, 153.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(162.4,60,153.2);color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(158.4, 72, 152.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(158.4,72,152.4);color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(70.8, 84.8, 207.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(70.8,84.8,207.6);color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(74, 90, 205.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(74,90,205.6);color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(82, 70.4, 232.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(82,70.4,232.8);color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(84.2, 64.4, 147.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(84.2,64.4,147.8);color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(107.4, 46, 212.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(107.4,46,212.6);color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(159.4, 64.4, 171.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(159.4,64.4,171.8);color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(159, 70, 139.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(159,70,139.8);color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(167.8, 90, 123.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(167.8,90,123.8);color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(163.8, 102, 123);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(163.8,102,123);color:#fff}.bg-gradient-purple-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(76.2, 114.8, 178.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(76.2,114.8,178.2);color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(79.4, 120, 176.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(79.4,120,176.2);color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(87.4, 100.4, 203.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(87.4,100.4,203.4);color:#fff}.bg-gradient-pink-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(156.8, 62, 116);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(156.8,62,116);color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(180, 43.6, 180.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(180,43.6,180.8);color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(183.6, 63.6, 161.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(183.6,63.6,161.2);color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(231.6, 67.6, 108);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(231.6,67.6,108);color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(240.4, 87.6, 92);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(240.4,87.6,92);color:#fff}.bg-gradient-pink-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(236.4, 99.6, 91.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(236.4,99.6,91.2);color:#fff}.bg-gradient-pink-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(148.8, 112.4, 146.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(148.8,112.4,146.4);color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(152, 117.6, 144.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(152,117.6,144.4);color:#fff}.bg-gradient-pink-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(160, 98, 171.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e83e8c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(160,98,171.6);color:#fff}.bg-gradient-red-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(156.2, 70.4, 68);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(156.2,70.4,68);color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(179.4, 52, 132.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(179.4,52,132.8);color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(183, 72, 113.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(183,72,113.2);color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(231.4, 70.4, 92);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(231.4,70.4,92);color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(239.8, 96, 44);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(239.8,96,44);color:#fff}.bg-gradient-red-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(235.8, 108, 43.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(235.8,108,43.2);color:#fff}.bg-gradient-red-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(148.2, 120.8, 98.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(148.2,120.8,98.4);color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(151.4, 126, 96.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(151.4,126,96.4);color:#fff}.bg-gradient-red-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(159.4, 106.4, 123.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #e74c3c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(159.4,106.4,123.6);color:#fff}.bg-gradient-orange-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(169.4, 100.4, 44);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(169.4,100.4,44);color:#fff}.bg-gradient-orange-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(192.6, 82, 108.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(192.6,82,108.8);color:#fff}.bg-gradient-orange-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(196.2, 102, 89.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(196.2,102,89.2);color:#fff}.bg-gradient-orange-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(244.6, 100.4, 68);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(244.6,100.4,68);color:#fff}.bg-gradient-orange-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(244.2, 106, 36);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(244.2,106,36);color:#fff}.bg-gradient-orange-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(249, 138, 19.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(249,138,19.2);color:#fff}.bg-gradient-orange-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(161.4, 150.8, 74.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(161.4,150.8,74.4);color:#fff}.bg-gradient-orange-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(164.6, 156, 72.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(164.6,156,72.4);color:#fff}.bg-gradient-orange-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(172.6, 136.4, 99.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(172.6,136.4,99.6);color:#fff}.bg-gradient-yellow-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(163.4, 118.4, 42.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(163.4,118.4,42.8);color:#fff}.bg-gradient-yellow-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(186.6, 100, 107.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(186.6,100,107.6);color:#fff}.bg-gradient-yellow-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(190.2, 120, 88);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(190.2,120,88);color:#fff}.bg-gradient-yellow-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(238.6, 118.4, 66.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(238.6,118.4,66.8);color:#fff}.bg-gradient-yellow-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(238.2, 124, 34.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(238.2,124,34.8);color:#fff}.bg-gradient-yellow-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(247, 144, 18.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(247,144,18.8);color:#fff}.bg-gradient-yellow-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(155.4, 168.8, 73.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(155.4,168.8,73.2);color:#fff}.bg-gradient-yellow-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(158.6, 174, 71.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(158.6,174,71.2);color:#fff}.bg-gradient-yellow-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(166.6, 154.4, 98.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #f39c12 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(166.6,154.4,98.4);color:#fff}.bg-gradient-green-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(32, 137.6, 125.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(32,137.6,125.6);color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(55.2, 119.2, 190.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(55.2,119.2,190.4);color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(58.8, 139.2, 170.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(58.8,139.2,170.8);color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(107.2, 137.6, 149.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(107.2,137.6,149.6);color:#fff}.bg-gradient-green-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(106.8, 143.2, 117.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(106.8,143.2,117.6);color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(115.6, 163.2, 101.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(115.6,163.2,101.6);color:#fff}.bg-gradient-green-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(111.6, 175.2, 100.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(111.6,175.2,100.8);color:#fff}.bg-gradient-green-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(27.2, 193.2, 154);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(27.2,193.2,154);color:#fff}.bg-gradient-green-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(35.2, 173.6, 181.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #18bc9c var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(35.2,173.6,181.2);color:#fff}.bg-gradient-teal-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(36.8, 145.4, 122.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(36.8,145.4,122.6);color:#fff}.bg-gradient-teal-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(60, 127, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(60,127,187.4);color:#fff}.bg-gradient-teal-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(63.6, 147, 167.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(63.6,147,167.8);color:#fff}.bg-gradient-teal-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(112, 145.4, 146.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(112,145.4,146.6);color:#fff}.bg-gradient-teal-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(111.6, 151, 114.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(111.6,151,114.6);color:#fff}.bg-gradient-teal-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(120.4, 171, 98.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(120.4,171,98.6);color:#fff}.bg-gradient-teal-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(116.4, 183, 97.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(116.4,183,97.8);color:#fff}.bg-gradient-teal-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(28.8, 195.8, 153);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(28.8,195.8,153);color:#fff}.bg-gradient-teal-cyan{--bslib-color-fg: #fff;--bslib-color-bg: rgb(40, 181.4, 178.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #3498db var(--bg-gradient-end, 180%)) rgb(40,181.4,178.2);color:#fff}.bg-gradient-cyan-blue{--bslib-color-fg: #fff;--bslib-color-bg: rgb(48.8, 116, 163.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #2c3e50 var(--bg-gradient-end, 180%)) rgb(48.8,116,163.4);color:#fff}.bg-gradient-cyan-indigo{--bslib-color-fg: #fff;--bslib-color-bg: rgb(72, 97.6, 228.2);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) rgb(72,97.6,228.2);color:#fff}.bg-gradient-cyan-purple{--bslib-color-fg: #fff;--bslib-color-bg: rgb(75.6, 117.6, 208.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) rgb(75.6,117.6,208.6);color:#fff}.bg-gradient-cyan-pink{--bslib-color-fg: #fff;--bslib-color-bg: rgb(124, 116, 187.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e83e8c var(--bg-gradient-end, 180%)) rgb(124,116,187.4);color:#fff}.bg-gradient-cyan-red{--bslib-color-fg: #fff;--bslib-color-bg: rgb(123.6, 121.6, 155.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #e74c3c var(--bg-gradient-end, 180%)) rgb(123.6,121.6,155.4);color:#fff}.bg-gradient-cyan-orange{--bslib-color-fg: #fff;--bslib-color-bg: rgb(132.4, 141.6, 139.4);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) rgb(132.4,141.6,139.4);color:#fff}.bg-gradient-cyan-yellow{--bslib-color-fg: #fff;--bslib-color-bg: rgb(128.4, 153.6, 138.6);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #f39c12 var(--bg-gradient-end, 180%)) rgb(128.4,153.6,138.6);color:#fff}.bg-gradient-cyan-green{--bslib-color-fg: #fff;--bslib-color-bg: rgb(40.8, 166.4, 193.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #18bc9c var(--bg-gradient-end, 180%)) rgb(40.8,166.4,193.8);color:#fff}.bg-gradient-cyan-teal{--bslib-color-fg: #fff;--bslib-color-bg: rgb(44, 171.6, 191.8);background:linear-gradient(var(--bg-gradient-deg, 140deg), #3498db var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) rgb(44,171.6,191.8);color:#fff}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #fff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:"Β "}.bslib-value-box .value-box-value{font-size:calc(1.275rem + 0.3vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.5rem}}.bslib-value-box .value-box-value:empty::after{content:"Β "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.275rem + 0.3vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.5rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-page-sidebar-title-bg: #2c3e50;--bslib-page-sidebar-title-color: #fff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #dee2e6}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.25rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.quarto-container{min-height:calc(100vh - 132px)}body.hypothesis-enabled #quarto-header{margin-right:16px}footer.footer .nav-footer,#quarto-header>nav{padding-left:1em;padding-right:1em}footer.footer div.nav-footer p:first-child{margin-top:0}footer.footer div.nav-footer p:last-child{margin-bottom:0}#quarto-content>*{padding-top:14px}#quarto-content>#quarto-sidebar-glass{padding-top:0px}@media(max-width: 991.98px){#quarto-content>*{padding-top:0}#quarto-content .subtitle{padding-top:14px}#quarto-content section:first-of-type h2:first-of-type,#quarto-content section:first-of-type .h2:first-of-type{margin-top:1rem}}.headroom-target,header.headroom{will-change:transform;transition:position 200ms linear;transition:all 200ms linear}header.headroom--pinned{transform:translateY(0%)}header.headroom--unpinned{transform:translateY(-100%)}.navbar-container{width:100%}.navbar-brand{overflow:hidden;text-overflow:ellipsis}.navbar-brand-container{max-width:calc(100% - 115px);min-width:0;display:flex;align-items:center}@media(min-width: 992px){.navbar-brand-container{margin-right:1em}}.navbar-brand.navbar-brand-logo{margin-right:4px;display:inline-flex}.navbar-toggler{flex-basis:content;flex-shrink:0}.navbar .navbar-brand-container{order:2}.navbar .navbar-toggler{order:1}.navbar .navbar-container>.navbar-nav{order:20}.navbar .navbar-container>.navbar-brand-container{margin-left:0 !important;margin-right:0 !important}.navbar .navbar-collapse{order:20}.navbar #quarto-search{order:4;margin-left:auto}.navbar .navbar-toggler{margin-right:.5em}.navbar-collapse .quarto-navbar-tools{margin-left:.5em}.navbar-logo{max-height:24px;width:auto;padding-right:4px}nav .nav-item:not(.compact){padding-top:1px}nav .nav-link i,nav .dropdown-item i{padding-right:1px}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.6rem;padding-right:.6rem}nav .nav-item.compact .nav-link{padding-left:.5rem;padding-right:.5rem;font-size:1.1rem}.navbar .quarto-navbar-tools{order:3}.navbar .quarto-navbar-tools div.dropdown{display:inline-block}.navbar .quarto-navbar-tools .quarto-navigation-tool{color:rgb(204.36,208.68,213)}.navbar .quarto-navbar-tools .quarto-navigation-tool:hover{color:#fff}.navbar-nav .dropdown-menu{min-width:220px;font-size:.9rem}.navbar .navbar-nav .nav-link.dropdown-toggle::after{opacity:.75;vertical-align:.175em}.navbar ul.dropdown-menu{padding-top:0;padding-bottom:0}.navbar .dropdown-header{text-transform:uppercase;font-size:.8rem;padding:0 .5rem}.navbar .dropdown-item{padding:.4rem .5rem}.navbar .dropdown-item>i.bi{margin-left:.1rem;margin-right:.25em}.sidebar #quarto-search{margin-top:-1px}.sidebar #quarto-search svg.aa-SubmitIcon{width:16px;height:16px}.sidebar-navigation a{color:inherit}.sidebar-title{margin-top:.25rem;padding-bottom:.5rem;font-size:1.3rem;line-height:1.6rem;visibility:visible}.sidebar-title>a{font-size:inherit;text-decoration:none}.sidebar-title .sidebar-tools-main{margin-top:-6px}@media(max-width: 991.98px){#quarto-sidebar div.sidebar-header{padding-top:.2em}}.sidebar-header-stacked .sidebar-title{margin-top:.6rem}.sidebar-logo{max-width:90%;padding-bottom:.5rem}.sidebar-logo-link{text-decoration:none}.sidebar-navigation li a{text-decoration:none}.sidebar-navigation .quarto-navigation-tool{opacity:.7;font-size:.875rem}#quarto-sidebar>nav>.sidebar-tools-main{margin-left:14px}.sidebar-tools-main{display:inline-flex;margin-left:0px;order:2}.sidebar-tools-main:not(.tools-wide){vertical-align:middle}.sidebar-navigation .quarto-navigation-tool.dropdown-toggle::after{display:none}.sidebar.sidebar-navigation>*{padding-top:1em}.sidebar-item{margin-bottom:.2em;line-height:1rem;margin-top:.4rem}.sidebar-section{padding-left:.5em;padding-bottom:.2em}.sidebar-item .sidebar-item-container{display:flex;justify-content:space-between;cursor:pointer}.sidebar-item-toggle:hover{cursor:pointer}.sidebar-item .sidebar-item-toggle .bi{font-size:.7rem;text-align:center}.sidebar-item .sidebar-item-toggle .bi-chevron-right::before{transition:transform 200ms ease}.sidebar-item .sidebar-item-toggle[aria-expanded=false] .bi-chevron-right::before{transform:none}.sidebar-item .sidebar-item-toggle[aria-expanded=true] .bi-chevron-right::before{transform:rotate(90deg)}.sidebar-item-text{width:100%}.sidebar-navigation .sidebar-divider{margin-left:0;margin-right:0;margin-top:.5rem;margin-bottom:.5rem}@media(max-width: 991.98px){.quarto-secondary-nav{display:block}.quarto-secondary-nav button.quarto-search-button{padding-right:0em;padding-left:2em}.quarto-secondary-nav button.quarto-btn-toggle{margin-left:-0.75rem;margin-right:.15rem}.quarto-secondary-nav nav.quarto-title-breadcrumbs{display:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs{display:flex;align-items:center;padding-right:1em;margin-left:-0.25em}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{text-decoration:none}.quarto-secondary-nav nav.quarto-page-breadcrumbs ol.breadcrumb{margin-bottom:0}}@media(min-width: 992px){.quarto-secondary-nav{display:none}}.quarto-title-breadcrumbs .breadcrumb{margin-bottom:.5em;font-size:.9rem}.quarto-title-breadcrumbs .breadcrumb li:last-of-type a{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{color:hsl(0,0%,35%)}.quarto-secondary-nav[aria-expanded=false] .quarto-btn-toggle .bi-chevron-right::before{transform:none}.quarto-secondary-nav[aria-expanded=true] .quarto-btn-toggle .bi-chevron-right::before{transform:rotate(90deg)}.quarto-secondary-nav .quarto-btn-toggle .bi-chevron-right::before{transition:transform 200ms ease}.quarto-secondary-nav{cursor:pointer}.no-decor{text-decoration:none}.quarto-secondary-nav-title{margin-top:.3em;color:hsl(0,0%,35%);padding-top:4px}.quarto-secondary-nav nav.quarto-page-breadcrumbs{color:hsl(0,0%,35%)}.quarto-secondary-nav nav.quarto-page-breadcrumbs a{color:hsl(0,0%,35%)}.quarto-secondary-nav nav.quarto-page-breadcrumbs a:hover{color:rgba(12.72,99.64,82.68,.8)}.quarto-secondary-nav nav.quarto-page-breadcrumbs .breadcrumb-item::before{color:hsl(0,0%,55%)}.breadcrumb-item{line-height:1.2rem}div.sidebar-item-container{color:hsl(0,0%,35%)}div.sidebar-item-container:hover,div.sidebar-item-container:focus{color:rgba(12.72,99.64,82.68,.8)}div.sidebar-item-container.disabled{color:hsla(0,0%,35%,.75)}div.sidebar-item-container .active,div.sidebar-item-container .show>.nav-link,div.sidebar-item-container .sidebar-link>code{color:rgb(12.72,99.64,82.68)}div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents,nav.sidebar.sidebar-navigation:not(.rollup){background-color:#fff}@media(max-width: 991.98px){.sidebar-navigation .sidebar-item a,.nav-page .nav-page-text,.sidebar-navigation{font-size:1rem}.sidebar-navigation ul.sidebar-section.depth1 .sidebar-section-item{font-size:1.1rem}.sidebar-logo{display:none}.sidebar.sidebar-navigation{position:static;border-bottom:1px solid #dee2e6}.sidebar.sidebar-navigation.collapsing{position:fixed;z-index:1000}.sidebar.sidebar-navigation.show{position:fixed;z-index:1000}.sidebar.sidebar-navigation{min-height:100%}nav.quarto-secondary-nav{background-color:#fff;border-bottom:1px solid #dee2e6}.quarto-banner nav.quarto-secondary-nav{background-color:#2c3e50;color:rgb(204.36,208.68,213);border-top:1px solid #dee2e6}.sidebar .sidebar-footer{visibility:visible;padding-top:1rem;position:inherit}.sidebar-tools-collapse{display:block}}#quarto-sidebar{transition:width .15s ease-in}#quarto-sidebar>*{padding-right:1em}@media(max-width: 991.98px){#quarto-sidebar .sidebar-menu-container{white-space:nowrap;min-width:225px}#quarto-sidebar.show{transition:width .15s ease-out}}@media(min-width: 992px){#quarto-sidebar{display:flex;flex-direction:column}.nav-page .nav-page-text,.sidebar-navigation .sidebar-section .sidebar-item{font-size:.875rem}.sidebar-navigation .sidebar-item{font-size:.925rem}.sidebar.sidebar-navigation{display:block;position:sticky}.sidebar-search{width:100%}.sidebar .sidebar-footer{visibility:visible}}@media(min-width: 992px){#quarto-sidebar-glass{display:none}}@media(max-width: 991.98px){#quarto-sidebar-glass{position:fixed;top:0;bottom:0;left:0;right:0;background-color:hsla(0,0%,100%,0);transition:background-color .15s ease-in;z-index:-1}#quarto-sidebar-glass.collapsing{z-index:1000}#quarto-sidebar-glass.show{transition:background-color .15s ease-out;background-color:hsla(0,0%,40%,.4);z-index:1000}}.sidebar .sidebar-footer{padding:.5rem 1rem;align-self:flex-end;color:#6c757d;width:100%}.quarto-page-breadcrumbs .breadcrumb-item+.breadcrumb-item,.quarto-page-breadcrumbs .breadcrumb-item{padding-right:.33em;padding-left:0}.quarto-page-breadcrumbs .breadcrumb-item::before{padding-right:.33em}.quarto-sidebar-footer{font-size:.875em}.sidebar-section .bi-chevron-right{vertical-align:middle}.sidebar-section .bi-chevron-right::before{font-size:.9em}.notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.btn:focus:not(:focus-visible){box-shadow:none}.page-navigation{display:flex;justify-content:space-between}.nav-page{padding-bottom:.75em}.nav-page .bi{font-size:1.8rem;vertical-align:middle}.nav-page .nav-page-text{padding-left:.25em;padding-right:.25em}.nav-page a{color:#6c757d;text-decoration:none;display:flex;align-items:center}.nav-page a:hover{color:rgb(19.2,150.4,124.8)}.nav-footer .toc-actions{padding-bottom:.5em;padding-top:.5em}.nav-footer .toc-actions a,.nav-footer .toc-actions a:hover{text-decoration:none}.nav-footer .toc-actions ul{display:flex;list-style:none}.nav-footer .toc-actions ul :first-child{margin-left:auto}.nav-footer .toc-actions ul :last-child{margin-right:auto}.nav-footer .toc-actions ul li{padding-right:1.5em}.nav-footer .toc-actions ul li i.bi{padding-right:.4em}.nav-footer .toc-actions ul li:last-of-type{padding-right:0}.nav-footer{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:baseline;text-align:center;padding-top:.5rem;padding-bottom:.5rem;background-color:#fff}body.nav-fixed{padding-top:82px}.nav-footer-contents{color:#6c757d;margin-top:.25rem}.nav-footer{min-height:3.5em;color:hsl(0,0%,46%)}.nav-footer a{color:hsl(0,0%,46%)}.nav-footer .nav-footer-left{font-size:.825em}.nav-footer .nav-footer-center{font-size:.825em}.nav-footer .nav-footer-right{font-size:.825em}.nav-footer-left .footer-items,.nav-footer-center .footer-items,.nav-footer-right .footer-items{display:inline-flex;padding-top:.3em;padding-bottom:.3em;margin-bottom:0em}.nav-footer-left .footer-items .nav-link,.nav-footer-center .footer-items .nav-link,.nav-footer-right .footer-items .nav-link{padding-left:.6em;padding-right:.6em}@media(min-width: 768px){.nav-footer-left{flex:1 1 0px;text-align:left}}@media(max-width: 575.98px){.nav-footer-left{margin-bottom:1em;flex:100%}}@media(min-width: 768px){.nav-footer-right{flex:1 1 0px;text-align:right}}@media(max-width: 575.98px){.nav-footer-right{margin-bottom:1em;flex:100%}}.nav-footer-center{text-align:center;min-height:3em}@media(min-width: 768px){.nav-footer-center{flex:1 1 0px}}.nav-footer-center .footer-items{justify-content:center}@media(max-width: 767.98px){.nav-footer-center{margin-bottom:1em;flex:100%}}@media(max-width: 767.98px){.nav-footer-center{margin-top:3em;order:10}}.navbar .quarto-reader-toggle.reader .quarto-reader-toggle-btn{background-color:rgb(204.36,208.68,213);border-radius:3px}@media(max-width: 991.98px){.quarto-reader-toggle{display:none}}.quarto-reader-toggle.reader.quarto-navigation-tool .quarto-reader-toggle-btn{background-color:hsl(0,0%,35%);border-radius:3px}.quarto-reader-toggle .quarto-reader-toggle-btn{display:inline-flex;padding-left:.2em;padding-right:.2em;margin-left:-0.2em;margin-right:-0.2em;text-align:center}.navbar .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle:not(.reader) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-reader-toggle.reader .bi::before{background-image:url('data:image/svg+xml,')}#quarto-back-to-top{display:none;position:fixed;bottom:50px;background-color:#fff;border-radius:.25rem;box-shadow:0 .2rem .5rem #6c757d,0 0 .05rem #6c757d;color:#6c757d;text-decoration:none;font-size:.9em;text-align:center;left:50%;padding:.4rem .8rem;transform:translate(-50%, 0)}#quarto-announcement{padding:.5em;display:flex;justify-content:space-between;margin-bottom:0;font-size:.9em}#quarto-announcement .quarto-announcement-content{margin-right:auto}#quarto-announcement .quarto-announcement-content p{margin-bottom:0}#quarto-announcement .quarto-announcement-icon{margin-right:.5em;font-size:1.2em;margin-top:-0.15em}#quarto-announcement .quarto-announcement-action{cursor:pointer}.aa-DetachedSearchButtonQuery{display:none}.aa-DetachedOverlay ul.aa-List,#quarto-search-results ul.aa-List{list-style:none;padding-left:0}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{background-color:#fff;position:absolute;z-index:2000}#quarto-search-results .aa-Panel{max-width:400px}#quarto-search input{font-size:.925rem}@media(min-width: 992px){.navbar #quarto-search{margin-left:.25rem;order:999}}.navbar.navbar-expand-sm #quarto-search,.navbar.navbar-expand-md #quarto-search{order:999}@media(min-width: 992px){.navbar .quarto-navbar-tools{order:900}}@media(min-width: 992px){.navbar .quarto-navbar-tools.tools-end{margin-left:auto !important}}@media(max-width: 991.98px){#quarto-sidebar .sidebar-search{display:none}}#quarto-sidebar .sidebar-search .aa-Autocomplete{width:100%}.navbar .aa-Autocomplete .aa-Form{width:180px}.navbar #quarto-search.type-overlay .aa-Autocomplete{width:40px}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form{background-color:inherit;border:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form:focus-within{box-shadow:none;outline:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper{display:none}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-InputWrapper:focus-within{display:inherit}.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-Label svg,.navbar #quarto-search.type-overlay .aa-Autocomplete .aa-Form .aa-LoadingIndicator svg{width:26px;height:26px;color:rgb(204.36,208.68,213);opacity:1}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:26px;height:26px;color:rgb(204.36,208.68,213);opacity:1}.aa-Autocomplete .aa-Form,.aa-DetachedFormContainer .aa-Form{align-items:center;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;color:#212529;display:flex;line-height:1em;margin:0;position:relative;width:100%}.aa-Autocomplete .aa-Form:focus-within,.aa-DetachedFormContainer .aa-Form:focus-within{box-shadow:rgba(44,62,80,.6) 0 0 0 1px;outline:currentColor none medium}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix{align-items:center;display:flex;flex-shrink:0;order:1}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{cursor:initial;flex-shrink:0;padding:0;text-align:left}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-Label svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator svg{color:#212529;opacity:.5}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-SubmitButton{appearance:none;background:none;border:0;margin:0}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator{align-items:center;display:flex;justify-content:center}.aa-Autocomplete .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperPrefix .aa-LoadingIndicator[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapper,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper{order:3;position:relative;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input{appearance:none;background:none;border:0;color:#212529;font:inherit;height:calc(1.5em + .1rem + 2px);padding:0;width:100%}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::placeholder,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::placeholder{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input:focus{border-color:none;box-shadow:none;outline:none}.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-Autocomplete .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-decoration,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-cancel-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-button,.aa-DetachedFormContainer .aa-Form .aa-InputWrapper .aa-Input::-webkit-search-results-decoration{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix{align-items:center;display:flex;order:4}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton{align-items:center;background:none;border:0;color:#212529;opacity:.8;cursor:pointer;display:flex;margin:0;width:calc(1.5em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton:focus{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton[hidden]{display:none}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-ClearButton svg{width:calc(1.5em + 0.75rem + calc(1px * 2))}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton{border:none;align-items:center;background:none;color:#212529;opacity:.4;font-size:.7rem;cursor:pointer;display:none;margin:0;width:calc(1em + .1rem + 2px)}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:hover,.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton:focus{color:#212529;opacity:.8}.aa-Autocomplete .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden],.aa-DetachedFormContainer .aa-Form .aa-InputWrapperSuffix .aa-CopyButton[hidden]{display:none}.aa-PanelLayout:empty{display:none}.quarto-search-no-results.no-query{display:none}.aa-Source:has(.no-query){display:none}#quarto-search-results .aa-Panel{border:solid #dee2e6 1px}#quarto-search-results .aa-SourceNoResults{width:398px}.aa-DetachedOverlay .aa-Panel,#quarto-search-results .aa-Panel{max-height:65vh;overflow-y:auto;font-size:.925rem}.aa-DetachedOverlay .aa-SourceNoResults,#quarto-search-results .aa-SourceNoResults{height:60px;display:flex;justify-content:center;align-items:center}.aa-DetachedOverlay .search-error,#quarto-search-results .search-error{padding-top:10px;padding-left:20px;padding-right:20px;cursor:default}.aa-DetachedOverlay .search-error .search-error-title,#quarto-search-results .search-error .search-error-title{font-size:1.1rem;margin-bottom:.5rem}.aa-DetachedOverlay .search-error .search-error-title .search-error-icon,#quarto-search-results .search-error .search-error-title .search-error-icon{margin-right:8px}.aa-DetachedOverlay .search-error .search-error-text,#quarto-search-results .search-error .search-error-text{font-weight:300}.aa-DetachedOverlay .search-result-text,#quarto-search-results .search-result-text{font-weight:300;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.2rem;max-height:2.4rem}.aa-DetachedOverlay .aa-SourceHeader .search-result-header,#quarto-search-results .aa-SourceHeader .search-result-header{font-size:.875rem;background-color:hsl(0,0%,95%);padding-left:14px;padding-bottom:4px;padding-top:4px}.aa-DetachedOverlay .aa-SourceHeader .search-result-header-no-results,#quarto-search-results .aa-SourceHeader .search-result-header-no-results{display:none}.aa-DetachedOverlay .aa-SourceFooter .algolia-search-logo,#quarto-search-results .aa-SourceFooter .algolia-search-logo{width:110px;opacity:.85;margin:8px;float:right}.aa-DetachedOverlay .search-result-section,#quarto-search-results .search-result-section{font-size:.925em}.aa-DetachedOverlay a.search-result-link,#quarto-search-results a.search-result-link{color:inherit;text-decoration:none}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item,#quarto-search-results li.aa-Item[aria-selected=true] .search-item{background-color:#2c3e50}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-result-text-container{color:#fff;background-color:#2c3e50}.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=true] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=true] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=true] .search-item .search-match.mark{color:#fff;background-color:rgb(58.4774193548,82.4,106.3225806452)}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item,#quarto-search-results li.aa-Item[aria-selected=false] .search-item{background-color:#fff}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item.search-result-more,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-section,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-title-container,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-result-text-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item.search-result-more,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-section,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-title-container,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-result-text-container{color:#212529}.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item mark.search-match,.aa-DetachedOverlay li.aa-Item[aria-selected=false] .search-item .search-match.mark,#quarto-search-results li.aa-Item[aria-selected=false] .search-item mark.search-match,#quarto-search-results li.aa-Item[aria-selected=false] .search-item .search-match.mark{color:inherit;background-color:hsl(210,29.0322580645%,66.3137254902%)}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-title-container{background-color:#fff;color:#212529}.aa-DetachedOverlay .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container,#quarto-search-results .aa-Item .search-result-doc:not(.document-selectable) .search-result-text-container{padding-top:0px}.aa-DetachedOverlay li.aa-Item .search-result-doc.document-selectable .search-result-text-container,#quarto-search-results li.aa-Item .search-result-doc.document-selectable .search-result-text-container{margin-top:-4px}.aa-DetachedOverlay .aa-Item,#quarto-search-results .aa-Item{cursor:pointer}.aa-DetachedOverlay .aa-Item .search-item,#quarto-search-results .aa-Item .search-item{border-left:none;border-right:none;border-top:none;background-color:#fff;border-color:#dee2e6;color:#212529}.aa-DetachedOverlay .aa-Item .search-item p,#quarto-search-results .aa-Item .search-item p{margin-top:0;margin-bottom:0}.aa-DetachedOverlay .aa-Item .search-item i.bi,#quarto-search-results .aa-Item .search-item i.bi{padding-left:8px;padding-right:8px;font-size:1.3em}.aa-DetachedOverlay .aa-Item .search-item .search-result-title,#quarto-search-results .aa-Item .search-item .search-result-title{margin-top:.3em;margin-bottom:0em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs,#quarto-search-results .aa-Item .search-item .search-result-crumbs{white-space:nowrap;text-overflow:ellipsis;font-size:.8em;font-weight:300;margin-right:1em}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap),#quarto-search-results .aa-Item .search-item .search-result-crumbs:not(.search-result-crumbs-wrap){max-width:30%;margin-left:auto;margin-top:.5em;margin-bottom:.1rem}.aa-DetachedOverlay .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap,#quarto-search-results .aa-Item .search-item .search-result-crumbs.search-result-crumbs-wrap{flex-basis:100%;margin-top:0em;margin-bottom:.2em;margin-left:37px}.aa-DetachedOverlay .aa-Item .search-result-title-container,#quarto-search-results .aa-Item .search-result-title-container{font-size:1em;display:flex;flex-wrap:wrap;padding:6px 4px 6px 4px}.aa-DetachedOverlay .aa-Item .search-result-text-container,#quarto-search-results .aa-Item .search-result-text-container{padding-bottom:8px;padding-right:8px;margin-left:42px}.aa-DetachedOverlay .aa-Item .search-result-doc-section,.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-doc-section,#quarto-search-results .aa-Item .search-result-more{padding-top:8px;padding-bottom:8px;padding-left:44px}.aa-DetachedOverlay .aa-Item .search-result-more,#quarto-search-results .aa-Item .search-result-more{font-size:.8em;font-weight:400}.aa-DetachedOverlay .aa-Item .search-result-doc,#quarto-search-results .aa-Item .search-result-doc{border-top:1px solid #dee2e6}.aa-DetachedSearchButton{background:none;border:none}.aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}.navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:rgb(204.36,208.68,213)}.sidebar-tools-collapse #quarto-search,.sidebar-tools-main #quarto-search{display:inline}.sidebar-tools-collapse #quarto-search .aa-Autocomplete,.sidebar-tools-main #quarto-search .aa-Autocomplete{display:inline}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton{padding-left:4px;padding-right:4px}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{color:hsl(0,0%,35%)}.sidebar-tools-collapse #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon,.sidebar-tools-main #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon .aa-SubmitIcon{margin-top:-3px}.aa-DetachedContainer{background:hsla(0,0%,100%,.65);width:90%;bottom:0;box-shadow:rgba(222,226,230,.6) 0 0 0 1px;outline:currentColor none medium;display:flex;flex-direction:column;left:0;margin:0;overflow:hidden;padding:0;position:fixed;right:0;top:0;z-index:1101}.aa-DetachedContainer::after{height:32px}.aa-DetachedContainer .aa-SourceHeader{margin:var(--aa-spacing-half) 0 var(--aa-spacing-half) 2px}.aa-DetachedContainer .aa-Panel{background-color:#fff;border-radius:0;box-shadow:none;flex-grow:1;margin:0;padding:0;position:relative}.aa-DetachedContainer .aa-PanelLayout{bottom:0;box-shadow:none;left:0;margin:0;max-height:none;overflow-y:auto;position:absolute;right:0;top:0;width:100%}.aa-DetachedFormContainer{background-color:#fff;border-bottom:1px solid #dee2e6;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:.5em}.aa-DetachedCancelButton{background:none;font-size:.8em;border:0;border-radius:3px;color:#212529;cursor:pointer;margin:0 0 0 .5em;padding:0 .5em}.aa-DetachedCancelButton:hover,.aa-DetachedCancelButton:focus{box-shadow:rgba(44,62,80,.6) 0 0 0 1px;outline:currentColor none medium}.aa-DetachedContainer--modal{bottom:inherit;height:auto;margin:0 auto;position:absolute;top:100px;border-radius:6px;max-width:850px}@media(max-width: 575.98px){.aa-DetachedContainer--modal{width:100%;top:0px;border-radius:0px;border:none}}.aa-DetachedContainer--modal .aa-PanelLayout{max-height:var(--aa-detached-modal-max-height);padding-bottom:var(--aa-spacing-half);position:static}.aa-Detached{height:100vh;overflow:hidden}.aa-DetachedOverlay{background-color:rgba(33,37,41,.4);position:fixed;left:0;right:0;top:0;margin:0;padding:0;height:100vh;z-index:1100}.quarto-dashboard.nav-fixed.dashboard-sidebar #quarto-content.quarto-dashboard-content{padding:0em}.quarto-dashboard #quarto-content.quarto-dashboard-content{padding:1em}.quarto-dashboard #quarto-content.quarto-dashboard-content>*{padding-top:0}@media(min-width: 576px){.quarto-dashboard{height:100%}}.quarto-dashboard .card.valuebox.bslib-card.bg-primary{background-color:rgba(39,128,227,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-secondary{background-color:#6c757d !important}.quarto-dashboard .card.valuebox.bslib-card.bg-success{background-color:rgba(63,182,24,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-info{background-color:rgba(153,84,187,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-warning{background-color:rgba(255,117,24,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-danger{background-color:rgba(255,0,57,.7) !important}.quarto-dashboard .card.valuebox.bslib-card.bg-light{background-color:#ecf0f1 !important}.quarto-dashboard .card.valuebox.bslib-card.bg-dark{background-color:#7b8a8b !important}.quarto-dashboard.dashboard-fill{display:flex;flex-direction:column}.quarto-dashboard #quarto-appendix{display:none}.quarto-dashboard #quarto-header #quarto-dashboard-header{border-top:solid 1px rgb(62.0967741935,87.5,112.9032258065);border-bottom:solid 1px rgb(62.0967741935,87.5,112.9032258065)}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav{padding-left:1em;padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header>nav .navbar-brand-container{padding-left:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler{margin-right:0}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-toggler-icon{height:1em;width:1em;background-image:url('data:image/svg+xml,')}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-brand-container{padding-right:1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-title{font-size:1.1em}.quarto-dashboard #quarto-header #quarto-dashboard-header .navbar-nav{font-size:.9em}.quarto-dashboard #quarto-dashboard-header .navbar{padding:0}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-container{padding-left:1em}.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-brand-container .nav-link,.quarto-dashboard #quarto-dashboard-header .navbar.slim .navbar-nav .nav-link{padding:.7em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-color-scheme-toggle{order:9}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-toggler{margin-left:.5em;order:10}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .nav-link{padding:.5em;height:100%;display:flex;align-items:center}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-nav .active{background-color:rgb(58.4774193548,82.4,106.3225806452)}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{padding:.5em .5em .5em 0;display:flex;flex-direction:row;margin-right:2em;align-items:center}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-brand-container{margin-right:auto}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{align-self:stretch}@media(min-width: 768px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:8}}@media(max-width: 767.98px){.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse{order:1000;padding-bottom:.5em}}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-collapse .navbar-nav{align-self:stretch}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title{font-size:1.25em;line-height:1.1em;display:flex;flex-direction:row;flex-wrap:wrap;align-items:baseline}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title .navbar-title-text{margin-right:.4em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-title a{text-decoration:none;color:inherit}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-subtitle,.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{font-size:.9rem;margin-right:.5em}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-author{margin-left:auto}.quarto-dashboard #quarto-dashboard-header .navbar .navbar-logo{max-height:48px;min-height:30px;object-fit:cover;margin-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-links{order:9;padding-right:1em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link-text{margin-left:.25em}.quarto-dashboard #quarto-dashboard-header .navbar .quarto-dashboard-link{padding-right:0em;padding-left:.7em;text-decoration:none;color:rgb(204.36,208.68,213)}.quarto-dashboard .page-layout-custom .tab-content{padding:0;border:none}.quarto-dashboard-img-contain{height:100%;width:100%;object-fit:contain}@media(max-width: 575.98px){.quarto-dashboard .bslib-grid{grid-template-rows:minmax(1em, max-content) !important}.quarto-dashboard .sidebar-content{height:inherit}.quarto-dashboard .page-layout-custom{min-height:100vh}}.quarto-dashboard.dashboard-toolbar>.page-layout-custom,.quarto-dashboard.dashboard-sidebar>.page-layout-custom{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages{padding:0}.quarto-dashboard .callout{margin-bottom:0;margin-top:0}.quarto-dashboard .html-fill-container figure{overflow:hidden}.quarto-dashboard bslib-tooltip .rounded-pill{border:solid #6c757d 1px}.quarto-dashboard bslib-tooltip .rounded-pill .svg{fill:#212529}.quarto-dashboard .tabset .dashboard-card-no-title .nav-tabs{margin-left:0;margin-right:auto}.quarto-dashboard .tabset .tab-content{border:none}.quarto-dashboard .tabset .card-header .nav-link[role=tab]{margin-top:-6px;padding-top:6px;padding-bottom:6px}.quarto-dashboard .card.valuebox,.quarto-dashboard .card.bslib-value-box{min-height:3rem}.quarto-dashboard .card.valuebox .card-body,.quarto-dashboard .card.bslib-value-box .card-body{padding:0}.quarto-dashboard .bslib-value-box .value-box-value{font-size:clamp(.1em,15cqw,5em)}.quarto-dashboard .bslib-value-box .value-box-showcase .bi{font-size:clamp(.1em,max(18cqw,5.2cqh),5em);text-align:center;height:1em}.quarto-dashboard .bslib-value-box .value-box-showcase .bi::before{vertical-align:1em}.quarto-dashboard .bslib-value-box .value-box-area{margin-top:auto;margin-bottom:auto}.quarto-dashboard .card figure.quarto-float{display:flex;flex-direction:column;align-items:center}.quarto-dashboard .dashboard-scrolling{padding:1em}.quarto-dashboard .full-height{height:100%}.quarto-dashboard .showcase-bottom .value-box-grid{display:grid;grid-template-columns:1fr;grid-template-rows:1fr auto;grid-template-areas:"top" "bottom"}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-showcase i.bi{font-size:4rem}.quarto-dashboard .showcase-bottom .value-box-grid .value-box-area{grid-area:top}.quarto-dashboard .tab-content{margin-bottom:0}.quarto-dashboard .bslib-card .bslib-navs-card-title{justify-content:stretch;align-items:end}.quarto-dashboard .card-header{display:flex;flex-wrap:wrap;justify-content:space-between}.quarto-dashboard .card-header .card-title{display:flex;flex-direction:column;justify-content:center;margin-bottom:0}.quarto-dashboard .tabset .card-toolbar{margin-bottom:1em}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{border:none;gap:var(--bslib-spacer, 1rem)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{padding:0}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.sidebar{border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.collapse-toggle{display:none}@media(max-width: 767.98px){.quarto-dashboard .bslib-grid>.bslib-sidebar-layout{grid-template-columns:1fr;grid-template-rows:max-content 1fr}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout>.main{grid-column:1;grid-row:2}.quarto-dashboard .bslib-grid>.bslib-sidebar-layout .sidebar{grid-column:1;grid-row:1}}.quarto-dashboard .sidebar-right .sidebar{padding-left:2.5em}.quarto-dashboard .sidebar-right .collapse-toggle{left:2px}.quarto-dashboard .quarto-dashboard .sidebar-right button.collapse-toggle:not(.transitioning){left:unset}.quarto-dashboard aside.sidebar{padding-left:1em;padding-right:1em;background-color:rgba(52,58,64,.25);color:#212529}.quarto-dashboard .bslib-sidebar-layout>div.main{padding:.7em}.quarto-dashboard .bslib-sidebar-layout button.collapse-toggle{margin-top:.3em}.quarto-dashboard .bslib-sidebar-layout .collapse-toggle{top:0}.quarto-dashboard .bslib-sidebar-layout.sidebar-collapsed:not(.transitioning):not(.sidebar-right) .collapse-toggle{left:2px}.quarto-dashboard .sidebar>section>.h3:first-of-type{margin-top:0em}.quarto-dashboard .sidebar .h3,.quarto-dashboard .sidebar .h4,.quarto-dashboard .sidebar .h5,.quarto-dashboard .sidebar .h6{margin-top:.5em}.quarto-dashboard .sidebar form{flex-direction:column;align-items:start;margin-bottom:1em}.quarto-dashboard .sidebar form div[class*=oi-][class$=-input]{flex-direction:column}.quarto-dashboard .sidebar form[class*=oi-][class$=-toggle]{flex-direction:row-reverse;align-items:center;justify-content:start}.quarto-dashboard .sidebar form input[type=range]{margin-top:.5em;margin-right:.8em;margin-left:1em}.quarto-dashboard .sidebar label{width:fit-content}.quarto-dashboard .sidebar .card-body{margin-bottom:2em}.quarto-dashboard .sidebar .shiny-input-container{margin-bottom:1em}.quarto-dashboard .sidebar .shiny-options-group{margin-top:0}.quarto-dashboard .sidebar .control-label{margin-bottom:.3em}.quarto-dashboard .card .card-body .quarto-layout-row{align-items:stretch}.quarto-dashboard .toolbar{font-size:.9em;display:flex;flex-direction:row;border-top:solid 1px hsl(208.2352941176,6.1371841155%,79.137254902%);padding:1em;flex-wrap:wrap;background-color:rgba(52,58,64,.25)}.quarto-dashboard .toolbar .cell-output-display{display:flex}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar>*:last-child{margin-right:0}.quarto-dashboard .toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .toolbar .input-daterange{width:inherit}.quarto-dashboard .toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .toolbar form{width:fit-content}.quarto-dashboard .toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .toolbar form input[type=date]{width:fit-content}.quarto-dashboard .toolbar form input[type=color]{width:3em}.quarto-dashboard .toolbar form button{padding:.4em}.quarto-dashboard .toolbar form select{width:fit-content}.quarto-dashboard .toolbar>*{font-size:.9em;flex-grow:0}.quarto-dashboard .toolbar .shiny-input-container label{margin-bottom:1px}.quarto-dashboard .toolbar-bottom{margin-top:1em;margin-bottom:0 !important;order:2}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>.tab-content>.tab-pane>*:not(.bslib-sidebar-layout){padding:1em}.quarto-dashboard .quarto-dashboard-content>.dashboard-toolbar-container>.toolbar-content>*:not(.tab-content){padding:1em}.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page>.dashboard-toolbar-container>.toolbar-content,.quarto-dashboard .quarto-dashboard-content>.tab-content>.dashboard-page:not(.dashboard-sidebar-container)>*:not(.dashboard-toolbar-container){padding:1em}.quarto-dashboard .toolbar-content{padding:0}.quarto-dashboard .quarto-dashboard-content.quarto-dashboard-pages .tab-pane>.dashboard-toolbar-container .toolbar{border-radius:0;margin-bottom:0}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar{border-bottom:1px solid rgba(0,0,0,.175)}.quarto-dashboard .dashboard-toolbar-container.toolbar-toplevel .toolbar-bottom{margin-top:0}.quarto-dashboard .dashboard-toolbar-container:not(.toolbar-toplevel) .toolbar{margin-bottom:1em;border-top:none;border-radius:.25rem;border:1px solid rgba(0,0,0,.175)}.quarto-dashboard .vega-embed.has-actions details{width:1.7em;height:2em;position:absolute !important;top:0;right:0}.quarto-dashboard .dashboard-toolbar-container{padding:0}.quarto-dashboard .card .card-header p:last-child,.quarto-dashboard .card .card-footer p:last-child{margin-bottom:0}.quarto-dashboard .card .card-body>.h4:first-child{margin-top:0}.quarto-dashboard .card .card-body{z-index:4}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_length,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_info,.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate{text-align:initial}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_filter{text-align:right}.quarto-dashboard .card .card-body .itables div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:initial}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding-top:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper table{flex-shrink:0}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons{margin-bottom:.5em;margin-left:auto;width:fit-content;float:right}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons.btn-group{background:#fff;border:none}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn-secondary{background-color:#fff;background-image:none;border:solid #dee2e6 1px;padding:.2em .7em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dt-buttons .btn span{font-size:.8em;color:#212529}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{margin-left:.5em;margin-bottom:.5em;padding-top:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.875em}}@media(max-width: 767.98px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_info{font-size:.8em}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter{margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_filter input[type=search]{padding:1px 5px 1px 5px;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length{flex-basis:1 1 50%;margin-bottom:.5em;font-size:.875em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_length select{padding:.4em 3em .4em .5em;font-size:.875em;margin-left:.2em;margin-right:.2em}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{flex-shrink:0}@media(min-width: 768px){.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate{margin-left:auto}}.quarto-dashboard .card .card-body .itables .dataTables_wrapper .dataTables_paginate ul.pagination .paginate_button .page-link{font-size:.8em}.quarto-dashboard .card .card-footer{font-size:.9em}.quarto-dashboard .card .card-toolbar{display:flex;flex-grow:1;flex-direction:row;width:100%;flex-wrap:wrap}.quarto-dashboard .card .card-toolbar>*{font-size:.8em;flex-grow:0}.quarto-dashboard .card .card-toolbar>.card-title{font-size:1em;flex-grow:1;align-self:flex-start;margin-top:.1em}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar form{width:fit-content}.quarto-dashboard .card .card-toolbar form label{padding-top:.2em;padding-bottom:.2em;width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=date]{width:fit-content}.quarto-dashboard .card .card-toolbar form input[type=color]{width:3em}.quarto-dashboard .card .card-toolbar form button{padding:.4em}.quarto-dashboard .card .card-toolbar form select{width:fit-content}.quarto-dashboard .card .card-toolbar .cell-output-display{display:flex}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:.5em;margin-bottom:.5em;width:inherit}.quarto-dashboard .card .card-toolbar .shiny-input-container>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card .card-toolbar>*:last-child{margin-right:0}.quarto-dashboard .card .card-toolbar>*>*{margin-right:1em;align-items:baseline}.quarto-dashboard .card .card-toolbar>*>*>a{text-decoration:none;margin-top:auto;margin-bottom:auto}.quarto-dashboard .card .card-toolbar .shiny-input-container{padding-bottom:0;margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container>*{flex-shrink:0;flex-grow:0}.quarto-dashboard .card .card-toolbar .form-group.shiny-input-container:not([role=group])>label{margin-bottom:0}.quarto-dashboard .card .card-toolbar .shiny-input-container.no-baseline{align-items:start;padding-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-container{display:flex;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-container label{padding-right:.4em}.quarto-dashboard .card .card-toolbar .shiny-input-container .bslib-input-switch{margin-top:6px}.quarto-dashboard .card .card-toolbar input[type=text]{line-height:1;width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange{width:inherit}.quarto-dashboard .card .card-toolbar .input-daterange input[type=text]{height:2.4em;width:10em}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon{height:auto;padding:0;margin-left:-5px !important;margin-right:-5px}.quarto-dashboard .card .card-toolbar .input-daterange .input-group-addon .input-group-text{padding-top:0;padding-bottom:0;height:100%}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny{width:10em}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-line{top:9px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-min,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-max,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-from,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-to,.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-single{top:20px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-bar{top:8px}.quarto-dashboard .card .card-toolbar span.irs.irs--shiny .irs-handle{top:0px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-checkboxgroup>.shiny-options-group{margin-top:0;align-items:baseline}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>label{margin-top:6px}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group{align-items:baseline;margin-top:0}.quarto-dashboard .card .card-toolbar .shiny-input-radiogroup>.shiny-options-group>.radio{margin-right:.3em}.quarto-dashboard .card .card-toolbar .form-select{padding-top:.2em;padding-bottom:.2em}.quarto-dashboard .card .card-toolbar .shiny-input-select{min-width:6em}.quarto-dashboard .card .card-toolbar div.checkbox{margin-bottom:0px}.quarto-dashboard .card .card-toolbar>.checkbox:first-child{margin-top:6px}.quarto-dashboard .card-body>table>thead{border-top:none}.quarto-dashboard .card-body>.table>:not(caption)>*>*,.quarto-dashboard .doc-reference section.card-body.doc-group>dl>:not(caption)>*>*,.doc-reference .quarto-dashboard section.card-body.doc-group>dl>:not(caption)>*>*{background-color:#fff}.tableFloatingHeaderOriginal{background-color:#fff;position:sticky !important;top:0 !important}.dashboard-data-table{margin-top:-1px}div.value-box-area span.observablehq--number{font-size:calc(clamp(.1em,15cqw,5em)*1.25);line-height:1.2;color:inherit;font-family:var(--bs-body-font-family)}.quarto-listing{padding-bottom:1em}.listing-pagination{padding-top:.5em}ul.pagination{float:right;padding-left:8px;padding-top:.5em}ul.pagination li{padding-right:.75em}ul.pagination li.disabled a,ul.pagination li.active a{color:#fff;text-decoration:none}ul.pagination li:last-of-type{padding-right:0}.listing-actions-group{display:flex}.quarto-listing-filter{margin-bottom:1em;width:200px;margin-left:auto}.quarto-listing-sort{margin-bottom:1em;margin-right:auto;width:auto}.quarto-listing-sort .input-group-text{font-size:.8em}.input-group-text{border-right:none}.quarto-listing-sort select.form-select{font-size:.8em}.listing-no-matching{text-align:center;padding-top:2em;padding-bottom:3em;font-size:1em}#quarto-margin-sidebar .quarto-listing-category{padding-top:0;font-size:1rem}#quarto-margin-sidebar .quarto-listing-category-title{cursor:pointer;font-weight:600;font-size:1rem}.quarto-listing-category .category{cursor:pointer}.quarto-listing-category .category.active{font-weight:600}.quarto-listing-category.category-cloud{display:flex;flex-wrap:wrap;align-items:baseline}.quarto-listing-category.category-cloud .category{padding-right:5px}.quarto-listing-category.category-cloud .category-cloud-1{font-size:.75em}.quarto-listing-category.category-cloud .category-cloud-2{font-size:.95em}.quarto-listing-category.category-cloud .category-cloud-3{font-size:1.15em}.quarto-listing-category.category-cloud .category-cloud-4{font-size:1.35em}.quarto-listing-category.category-cloud .category-cloud-5{font-size:1.55em}.quarto-listing-category.category-cloud .category-cloud-6{font-size:1.75em}.quarto-listing-category.category-cloud .category-cloud-7{font-size:1.95em}.quarto-listing-category.category-cloud .category-cloud-8{font-size:2.15em}.quarto-listing-category.category-cloud .category-cloud-9{font-size:2.35em}.quarto-listing-category.category-cloud .category-cloud-10{font-size:2.55em}.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-1{grid-template-columns:repeat(1, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-1{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-2{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-2{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-3{grid-template-columns:repeat(3, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-3{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-3{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-4{grid-template-columns:repeat(4, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-4{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-4{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-5{grid-template-columns:repeat(5, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-5{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-5{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-6{grid-template-columns:repeat(6, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-6{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-6{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-7{grid-template-columns:repeat(7, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-7{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-7{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-8{grid-template-columns:repeat(8, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-8{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-8{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-9{grid-template-columns:repeat(9, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-9{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-9{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-10{grid-template-columns:repeat(10, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-10{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-10{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-11{grid-template-columns:repeat(11, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-11{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-11{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-cols-12{grid-template-columns:repeat(12, minmax(0, 1fr));gap:1.5em}@media(max-width: 767.98px){.quarto-listing-cols-12{grid-template-columns:repeat(2, minmax(0, 1fr));gap:1.5em}}@media(max-width: 575.98px){.quarto-listing-cols-12{grid-template-columns:minmax(0, 1fr);gap:1.5em}}.quarto-listing-grid{gap:1.5em}.quarto-grid-item.borderless{border:none}.quarto-grid-item.borderless .listing-categories .listing-category:last-of-type,.quarto-grid-item.borderless .listing-categories .listing-category:first-of-type{padding-left:0}.quarto-grid-item.borderless .listing-categories .listing-category{border:0}.quarto-grid-link{text-decoration:none;color:inherit}.quarto-grid-link:hover{text-decoration:none;color:inherit}.quarto-grid-item h5.title,.quarto-grid-item .title.h5{margin-top:0;margin-bottom:0}.quarto-grid-item .card-footer{display:flex;justify-content:space-between;font-size:.8em}.quarto-grid-item .card-footer p{margin-bottom:0}.quarto-grid-item p.card-img-top{margin-bottom:0}.quarto-grid-item p.card-img-top>img{object-fit:cover}.quarto-grid-item .card-other-values{margin-top:.5em;font-size:.8em}.quarto-grid-item .card-other-values tr{margin-bottom:.5em}.quarto-grid-item .card-other-values tr>td:first-of-type{font-weight:600;padding-right:1em;padding-left:1em;vertical-align:top}.quarto-grid-item div.post-contents{display:flex;flex-direction:column;text-decoration:none;height:100%}.quarto-grid-item .listing-item-img-placeholder{background-color:rgba(52,58,64,.25);flex-shrink:0}.quarto-grid-item .card-attribution{padding-top:1em;display:flex;gap:1em;text-transform:uppercase;color:#6c757d;font-weight:500;flex-grow:10;align-items:flex-end}.quarto-grid-item .description{padding-bottom:1em}.quarto-grid-item .card-attribution .date{align-self:flex-end}.quarto-grid-item .card-attribution.justify{justify-content:space-between}.quarto-grid-item .card-attribution.start{justify-content:flex-start}.quarto-grid-item .card-attribution.end{justify-content:flex-end}.quarto-grid-item .card-title{margin-bottom:.1em}.quarto-grid-item .card-subtitle{padding-top:.25em}.quarto-grid-item .card-text{font-size:.9em}.quarto-grid-item .listing-reading-time{padding-bottom:.25em}.quarto-grid-item .card-text-small{font-size:.8em}.quarto-grid-item .card-subtitle.subtitle{font-size:.9em;font-weight:600;padding-bottom:.5em}.quarto-grid-item .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}.quarto-grid-item .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}.quarto-grid-item.card-right{text-align:right}.quarto-grid-item.card-right .listing-categories{justify-content:flex-end}.quarto-grid-item.card-left{text-align:left}.quarto-grid-item.card-center{text-align:center}.quarto-grid-item.card-center .listing-description{text-align:justify}.quarto-grid-item.card-center .listing-categories{justify-content:center}table.quarto-listing-table td.image{padding:0px}table.quarto-listing-table td.image img{width:100%;max-width:50px;object-fit:contain}table.quarto-listing-table a{text-decoration:none;word-break:keep-all}table.quarto-listing-table th a{color:inherit}table.quarto-listing-table th a.asc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table th a.desc:after{margin-bottom:-2px;margin-left:5px;display:inline-block;height:1rem;width:1rem;background-repeat:no-repeat;background-size:1rem 1rem;background-image:url('data:image/svg+xml,');content:""}table.quarto-listing-table.table-hover td{cursor:pointer}.quarto-post.image-left{flex-direction:row}.quarto-post.image-right{flex-direction:row-reverse}@media(max-width: 767.98px){.quarto-post.image-right,.quarto-post.image-left{gap:0em;flex-direction:column}.quarto-post .metadata{padding-bottom:1em;order:2}.quarto-post .body{order:1}.quarto-post .thumbnail{order:3}}.list.quarto-listing-default div:last-of-type{border-bottom:none}@media(min-width: 992px){.quarto-listing-container-default{margin-right:2em}}div.quarto-post{display:flex;gap:2em;margin-bottom:1.5em;border-bottom:1px solid #dee2e6}@media(max-width: 767.98px){div.quarto-post{padding-bottom:1em}}div.quarto-post .metadata{flex-basis:20%;flex-grow:0;margin-top:.2em;flex-shrink:10}div.quarto-post .thumbnail{flex-basis:30%;flex-grow:0;flex-shrink:0}div.quarto-post .thumbnail img{margin-top:.4em;width:100%;object-fit:cover}div.quarto-post .body{flex-basis:45%;flex-grow:1;flex-shrink:0}div.quarto-post .body h3.listing-title,div.quarto-post .body .listing-title.h3{margin-top:0px;margin-bottom:0px;border-bottom:none}div.quarto-post .body .listing-subtitle{font-size:.875em;margin-bottom:.5em;margin-top:.2em}div.quarto-post .body .description{font-size:.9em}div.quarto-post .body pre code{white-space:pre-wrap}div.quarto-post a{color:#212529;text-decoration:none}div.quarto-post .metadata{display:flex;flex-direction:column;font-size:.8em;font-family:Lato,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";flex-basis:33%}div.quarto-post .listing-categories{display:flex;flex-wrap:wrap;padding-bottom:5px}div.quarto-post .listing-categories .listing-category{color:#6c757d;border:solid 1px #dee2e6;border-radius:.25rem;text-transform:uppercase;font-size:.65em;padding-left:.5em;padding-right:.5em;padding-top:.15em;padding-bottom:.15em;cursor:pointer;margin-right:4px;margin-bottom:4px}div.quarto-post .listing-description{margin-bottom:.5em}div.quarto-about-jolla{display:flex !important;flex-direction:column;align-items:center;margin-top:10%;padding-bottom:1em}div.quarto-about-jolla .about-image{object-fit:cover;margin-left:auto;margin-right:auto;margin-bottom:1.5em}div.quarto-about-jolla img.round{border-radius:50%}div.quarto-about-jolla img.rounded{border-radius:10px}div.quarto-about-jolla .quarto-title h1.title,div.quarto-about-jolla .quarto-title .title.h1{text-align:center}div.quarto-about-jolla .quarto-title .description{text-align:center}div.quarto-about-jolla h2,div.quarto-about-jolla .h2{border-bottom:none}div.quarto-about-jolla .about-sep{width:60%}div.quarto-about-jolla main{text-align:center}div.quarto-about-jolla .about-links{display:flex}@media(min-width: 992px){div.quarto-about-jolla .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-jolla .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-jolla .about-link{color:rgb(78.4864864865,88,97.5135135135);text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-jolla .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-jolla .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-jolla .about-link:hover{color:#18bc9c}div.quarto-about-jolla .about-link i.bi{margin-right:.15em}div.quarto-about-solana{display:flex !important;flex-direction:column;padding-top:3em !important;padding-bottom:1em}div.quarto-about-solana .about-entity{display:flex !important;align-items:start;justify-content:space-between}@media(min-width: 992px){div.quarto-about-solana .about-entity{flex-direction:row}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity{flex-direction:column-reverse;align-items:center;text-align:center}}div.quarto-about-solana .about-entity .entity-contents{display:flex;flex-direction:column}@media(max-width: 767.98px){div.quarto-about-solana .about-entity .entity-contents{width:100%}}div.quarto-about-solana .about-entity .about-image{object-fit:cover}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-image{margin-bottom:1.5em}}div.quarto-about-solana .about-entity img.round{border-radius:50%}div.quarto-about-solana .about-entity img.rounded{border-radius:10px}div.quarto-about-solana .about-entity .about-links{display:flex;justify-content:left;padding-bottom:1.2em}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-solana .about-entity .about-link{color:rgb(78.4864864865,88,97.5135135135);text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-solana .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-solana .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-solana .about-entity .about-link:hover{color:#18bc9c}div.quarto-about-solana .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-solana .about-contents{padding-right:1.5em;flex-basis:0;flex-grow:1}div.quarto-about-solana .about-contents main.content{margin-top:0}div.quarto-about-solana .about-contents h2,div.quarto-about-solana .about-contents .h2{border-bottom:none}div.quarto-about-trestles{display:flex !important;flex-direction:row;padding-top:3em !important;padding-bottom:1em}@media(max-width: 991.98px){div.quarto-about-trestles{flex-direction:column;padding-top:0em !important}}div.quarto-about-trestles .about-entity{display:flex !important;flex-direction:column;align-items:center;text-align:center;padding-right:1em}@media(min-width: 992px){div.quarto-about-trestles .about-entity{flex:0 0 42%}}div.quarto-about-trestles .about-entity .about-image{object-fit:cover;margin-bottom:1.5em}div.quarto-about-trestles .about-entity img.round{border-radius:50%}div.quarto-about-trestles .about-entity img.rounded{border-radius:10px}div.quarto-about-trestles .about-entity .about-links{display:flex;justify-content:center}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-trestles .about-entity .about-link{color:rgb(78.4864864865,88,97.5135135135);text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-trestles .about-entity .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-trestles .about-entity .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-trestles .about-entity .about-link:hover{color:#18bc9c}div.quarto-about-trestles .about-entity .about-link i.bi{margin-right:.15em}div.quarto-about-trestles .about-contents{flex-basis:0;flex-grow:1}div.quarto-about-trestles .about-contents h2,div.quarto-about-trestles .about-contents .h2{border-bottom:none}@media(min-width: 992px){div.quarto-about-trestles .about-contents{border-left:solid 1px #dee2e6;padding-left:1.5em}}div.quarto-about-trestles .about-contents main.content{margin-top:0}div.quarto-about-marquee{padding-bottom:1em}div.quarto-about-marquee .about-contents{display:flex;flex-direction:column}div.quarto-about-marquee .about-image{max-height:550px;margin-bottom:1.5em;object-fit:cover}div.quarto-about-marquee img.round{border-radius:50%}div.quarto-about-marquee img.rounded{border-radius:10px}div.quarto-about-marquee h2,div.quarto-about-marquee .h2{border-bottom:none}div.quarto-about-marquee .about-links{display:flex;justify-content:center;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-marquee .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-marquee .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-marquee .about-link{color:rgb(78.4864864865,88,97.5135135135);text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-marquee .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-marquee .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-marquee .about-link:hover{color:#18bc9c}div.quarto-about-marquee .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-marquee .about-link{border:none}}div.quarto-about-broadside{display:flex;flex-direction:column;padding-bottom:1em}div.quarto-about-broadside .about-main{display:flex !important;padding-top:0 !important}@media(min-width: 992px){div.quarto-about-broadside .about-main{flex-direction:row;align-items:flex-start}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main{flex-direction:column}}@media(max-width: 991.98px){div.quarto-about-broadside .about-main .about-entity{flex-shrink:0;width:100%;height:450px;margin-bottom:1.5em;background-size:cover;background-repeat:no-repeat}}@media(min-width: 992px){div.quarto-about-broadside .about-main .about-entity{flex:0 10 50%;margin-right:1.5em;width:100%;height:100%;background-size:100%;background-repeat:no-repeat}}div.quarto-about-broadside .about-main .about-contents{padding-top:14px;flex:0 0 50%}div.quarto-about-broadside h2,div.quarto-about-broadside .h2{border-bottom:none}div.quarto-about-broadside .about-sep{margin-top:1.5em;width:60%;align-self:center}div.quarto-about-broadside .about-links{display:flex;justify-content:center;column-gap:20px;padding-top:1.5em}@media(min-width: 992px){div.quarto-about-broadside .about-links{flex-direction:row;column-gap:.8em;row-gap:15px;flex-wrap:wrap}}@media(max-width: 991.98px){div.quarto-about-broadside .about-links{flex-direction:column;row-gap:1em;width:100%;padding-bottom:1.5em}}div.quarto-about-broadside .about-link{color:rgb(78.4864864865,88,97.5135135135);text-decoration:none;border:solid 1px}@media(min-width: 992px){div.quarto-about-broadside .about-link{font-size:.8em;padding:.25em .5em;border-radius:4px}}@media(max-width: 991.98px){div.quarto-about-broadside .about-link{font-size:1.1em;padding:.5em .5em;text-align:center;border-radius:6px}}div.quarto-about-broadside .about-link:hover{color:#18bc9c}div.quarto-about-broadside .about-link i.bi{margin-right:.15em}@media(min-width: 992px){div.quarto-about-broadside .about-link{border:none}}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #dee2e6;border-radius:.25rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#dee2e6;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#dee2e6;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#dee2e6;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#dee2e6}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:#6c757d}details>summary>p:only-child{display:inline}div.code-copy-outer-scaffold{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! +* +* ansi colors from IPython notebook's +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #fff;--quarto-body-color: #212529;--quarto-text-muted: #6c757d;--quarto-border-color: #dee2e6;--quarto-border-width: 1px;--quarto-border-radius: 0.25rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #fff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: rgb(55.7432432432, 62.5, 69.2567567568);--mermaid-fg-color--lightest: rgb(78.4864864865, 88, 97.5135135135);--mermaid-font-family: Lato, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;--mermaid-label-bg-color: #fff;--mermaid-label-fg-color: #2c3e50;--mermaid-node-bg-color: rgba(44, 62, 80, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}body.quarto-light .dark-content{display:none !important}body.quarto-dark .light-content{display:none !important}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button-tooltip{font-size:.75em}.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#ecf0f1;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>p:has(+section){margin-bottom:2rem}main.content>section:first-of-type>h2:nth-child(1),main.content>section:first-of-type>.h2:nth-child(1){margin-top:0}h2,.h2{border-bottom:1px solid #dee2e6;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:hsl(210,10.8108108108%,39.5098039216%)}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:hsl(210,10.8108108108%,39.5098039216%)}.quarto-layout-cell[data-ref-parent] caption{color:hsl(210,10.8108108108%,39.5098039216%)}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:hsl(210,10.8108108108%,39.5098039216%);font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}body.quarto-dark .column-margin.column-container>.light-content+.dark-content{padding-top:0}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#ecf0f1 1px solid;border-right:#ecf0f1 1px solid;border-bottom:#ecf0f1 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(236,240,241,.65);border:1px solid rgba(236,240,241,.65);border-radius:.25rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow-y:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:hsl(210,10.8108108108%,39.5098039216%)}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p code.sourceCode,li code.sourceCode,td code.sourceCode{background-color:rgba(236,240,241,.65)}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:rgba(236,240,241,.65);padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:#6c757d;background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:#6c757d;margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#18bc9c}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#18bc9c}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #ecf0f1;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #18bc9c;color:#18bc9c !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#18bc9c !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#dee2e6}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.25rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #dee2e6;border-top:1px solid #dee2e6;border-bottom:1px solid #dee2e6}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400;margin-bottom:-0.4em;margin-top:.5em}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-empty-content>.callout-header{margin-bottom:0em;border-bottom-right-radius:calc(0.25rem + -1px)}.callout>.callout-header.collapsed{border-bottom-right-radius:calc(0.25rem + -1px)}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em;border-top-right-radius:calc(0.25rem + -1px)}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple:not(.callout-titled) .callout-body>:last-child,.callout.callout-style-simple:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.5em}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:#6c757d}div.callout.callout-style-default>.callout-header{background-color:#6c757d}div.callout-note.callout{border-left-color:#2c3e50}div.callout-note.callout-style-default>.callout-header{background-color:rgb(233.9,235.7,237.5)}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#18bc9c}div.callout-tip.callout-style-default>.callout-header{background-color:rgb(231.9,248.3,245.1)}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#f39c12}div.callout-warning.callout-style-default>.callout-header{background-color:rgb(253.8,245.1,231.3)}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:rgb(254.8,242.1,231.5)}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#e74c3c}div.callout-important.callout-style-default>.callout-header{background-color:rgb(252.6,237.1,235.5)}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#2c3e50;color:rgb(204.36,208.68,213)}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#dee2e6;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:hsl(0,0%,98%)}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:#dee2e6;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #dee2e6 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #dee2e6}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #dee2e6;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: rgb(253.53, 253.62, 253.7);--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: rgb(253.53, 253.62, 253.7);--bs-btn-hover-bg: rgb(130.05, 137.7, 144.5);--bs-btn-hover-border-color: rgb(122.7, 130.8, 138);--bs-btn-focus-shadow-rgb: 130, 137, 144;--bs-btn-active-color: #fff;--bs-btn-active-bg: rgb(137.4, 144.6, 151);--bs-btn-active-border-color: rgb(122.7, 130.8, 138);--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #fff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#2c3e50;color:rgb(204.36,208.68,213)}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:rgb(204.36,208.68,213)}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(236,240,241,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:rgb(55.7432432432,62.5,69.2567567568);border:solid rgb(55.7432432432,62.5,69.2567567568) 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#ecf0f1;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#ecf0f1;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table,.doc-reference section.doc-group>dl{border-top:1px solid rgb(210.6,211.4,212.2);border-bottom:1px solid rgb(210.6,211.4,212.2)}.table>thead,.doc-reference section.doc-group>dl>thead{border-top-width:0;border-bottom:1px solid #909294}.table a,.doc-reference section.doc-group>dl a{word-break:break-word}.table>:not(caption)>*>*,.doc-reference section.doc-group>dl>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}.screen-reader-only{position:absolute;clip:rect(0 0 0 0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;width:1px}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:rgb(204.36,208.68,213);background:#2c3e50}.quarto-title-banner a{color:rgb(204.36,208.68,213)}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:rgb(204.36,208.68,213)}.quarto-title-banner .code-tools-button{color:hsl(210,9.3264248705%,61.8352941176%)}.quarto-title-banner .code-tools-button:hover{color:rgb(204.36,208.68,213)}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.25rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}.bg-primary .navbar-nav .show>.nav-link,.bg-primary .navbar-nav .nav-link.active,.bg-primary .navbar-nav .nav-link:hover,.bg-primary .navbar-nav .nav-link:focus{color:#18bc9c !important}.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover,.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover{color:#2c3e50}.pagination a:hover{text-decoration:none}.badge.bg-light{color:#7b8a8b}.alert{color:#fff;border:none}.alert a,.alert .alert-link{color:#fff;text-decoration:underline}.alert-default{background-color:#6c757d}.alert-primary{background-color:#2c3e50}.alert-secondary{background-color:#6c757d}.alert-success{background-color:#18bc9c}.alert-info{background-color:#3498db}.alert-warning{background-color:#f39c12}.alert-danger{background-color:#e74c3c}.alert-light{background-color:#ecf0f1}.alert-dark{background-color:#7b8a8b}.alert-light,.alert-light a,.alert-light .alert-link{color:#212529}.modal .btn-close,.toast .btn-close,.offcanvas .btn-close{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e")}a{text-decoration:none}a.gdls-link{text-decoration:underline;text-underline-offset:.25em;text-decoration-thickness:.125em}a.gdls-code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.875em}h1.title,.title.h1{font-weight:600 !important}@media(min-width: 992px){h1.title,.title.h1{font-size:2.3rem}}h2,.h2{border-bottom:none;padding-bottom:0}h1.changelog-version,.changelog-version.h1,h2.changelog-version,.changelog-version.h2{display:flex;align-items:center;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1.6rem}h1.changelog-version::before,.changelog-version.h1::before,h2.changelog-version::before,.changelog-version.h2::before{content:"";width:1.15em;height:1.15em;flex:0 0 1.15em;transform:translateY(0.08em);background-color:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82Z'/%3E%3Cline x1='7' y1='7' x2='7.01' y2='7'/%3E%3C/svg%3E") no-repeat center/contain;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.59 13.41 11 3H4v7l9.59 9.59a2 2 0 0 0 2.82 0l4.18-4.18a2 2 0 0 0 0-2.82Z'/%3E%3Cline x1='7' y1='7' x2='7.01' y2='7'/%3E%3C/svg%3E") no-repeat center/contain}.description{font-style:italic}@media(max-width: 767.98px){.description{padding-bottom:1em}}table.gd-summary-table{border:none;margin:1em 0}table.gd-summary-table thead{display:none}table.gd-summary-table td,table.gd-summary-table th{border:none;padding:.5em .75em;vertical-align:top}table.gd-summary-table td{border-top:1px solid var(--bs-border-color, #dee2e6)}table.gd-summary-table tr:first-child td{border-top:none}table.gd-summary-table td:first-child{width:40%;font-weight:500;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}table.gd-summary-table td:first-child a{color:var(--bs-body-color);text-decoration:underline;text-underline-offset:.2em}table.gd-summary-table td:first-child a:hover{color:var(--bs-link-color)}table.gd-summary-table td:last-child{color:var(--bs-secondary-color, #6c757d);font-family:"Open Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}body.quarto-dark table.gd-summary-table td:last-child{color:var(--bs-body-color)}.table>tbody,.doc-reference section.doc-group>dl>tbody{border-bottom-color:#dee2e6}.navbar .dropdown-item{color:#343a40}.doc-reference section.doc-group>dl{border-top-style:dashed;border-bottom-style:dashed;padding-top:.5em}.doc-reference section.doc-group>dl>dt{margin-left:0px !important}.doc-reference dd>p:last-child{margin-bottom:0}.doc-reference dt a{color:inherit;text-decoration:underline;font-weight:bold;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.875em;text-underline-offset:.25em;text-decoration-thickness:.125em;word-break:initial}.doc-api-page .badge{position:relative;top:-3px}h2.doc-parameters,.doc-parameters.h2,h2.doc-returns,.doc-returns.h2,h2.doc-attributes,.doc-attributes.h2,h2.doc-functions,.doc-functions.h2,h2.doc-methods,.doc-methods.h2,h2.doc-classes,.doc-classes.h2,h2.doc-group,.doc-group.h2{font-size:22px;border-bottom:none;padding-bottom:0}header span.doc-object-name,h1 span.doc-object-name,.h1 span.doc-object-name,h2 span.doc-object-name,.h2 span.doc-object-name,h3 span.doc-object-name,.h3 span.doc-object-name,h4 span.doc-object-name,.h4 span.doc-object-name{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1.25rem}.doc-object span.doc-object-name:not(h1.title>span):not(.title.h1>span){opacity:.85}.doc-subject>p{font-style:italic}.content code.doc-symbol{font-size:.9rem}.doc-usage-source{display:flex;justify-content:space-between;align-items:baseline}.doc-usage-source p{margin-bottom:0rem;font-size:.7rem;text-transform:uppercase}.doc-usage-source>p:first-child{color:#aaa}.doc-usage-source a{color:#4682b4 !important;text-decoration:underline;font-weight:600}.doc-signature div.sourceCode{margin-top:.15rem;border-radius:0 !important}.doc-signature>div:first-child{background-color:rgb(241.6288,242.3344,243.04)}.doc-signature code{max-height:20rem;overflow:auto}.doc-signature>p:first-child{border-radius:.25rem}.doc-signature>p:first-child code{display:block}.doc-signature>p:first-child code a{color:#2c3e50}.doc-text:has(+section){margin-bottom:2rem}section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3){border-left:4px solid #d97706;background-color:#fffbeb;padding:.75rem 1rem;border-radius:4px;margin-top:1rem;margin-bottom:1rem;color:#1f2937}section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3)>:is(h2,.h2,h3,.h3){font-size:.875rem;font-weight:600;color:#1f2937;margin-top:0;margin-bottom:.25rem}section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3)>:is(h2,.h2,h3,.h3)::before{content:"⚠️"}section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3)>p{margin-bottom:0;color:#1f2937}section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3){border-left:4px solid #3b82f6;background-color:#eff6ff;padding:.75rem 1rem;border-radius:4px;margin-top:1rem;margin-bottom:1rem;color:#1f2937}section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3)>:is(h2,.h2,h3,.h3){font-size:.875rem;font-weight:600;color:#1f2937;margin-top:0;margin-bottom:.25rem}section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3)>:is(h2,.h2,h3,.h3)::before{content:"ℹ️"}section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3)>p{margin-bottom:0;color:#1f2937}:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dt{font-weight:normal}:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dd>table{min-width:33%;width:0}:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dl>dd>table>thead{border-top:0rem solid #dee2e6;border-bottom:.15em solid #dee2e6}:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code,.doc-signature>p>code{display:block;font-weight:normal}.doc-text dt code{font-weight:normal}:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code a,.doc-signature>p>code a{color:inherit;text-decoration:none}section.doc-attributes>section.doc-attribute,section.doc-methods>section.doc-method{border-left:.025rem solid #adb5bd;backgroud-color:aqua}:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) .doc-parameter-name{font-weight:bold}h2:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples),.h2:is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples){font-size:1.295rem}#toc-title{font-weight:600 !important;font-size:15px;color:dimgray;text-transform:uppercase}.sidebar nav li>a>code{color:#7d12ba;background-color:#f8f9fa;padding:.075rem .075rem}.gd-ref-sidebar #quarto-sidebar .sidebar-item-text{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}span.doc-object-name:is(.doc-class-name,.doc-method-name,.doc-module-name,.doc-function-name,.doc-alias-name,.doc-attribute-name,.doc-type-name,.doc-typevar)::before{font-size:.9rem;font-family:monospace;margin-right:.5rem;border-radius:.25rem}.sidebar span.doc-object-name:is(.doc-class-name,.doc-method-name,.doc-module-name,.doc-function-name,.doc-alias-name,.doc-attribute-name,.doc-type-name,.doc-typevar)::before{font-size:.55rem}.content span.doc-label::after{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.785rem;padding:.125rem .25rem;margin-left:1rem;vertical-align:middle;border-radius:.25rem;border-width:1px;border-style:solid}.content span.doc-label-class::after{content:"class"}.content span.doc-label-dataclass::after{content:"dataclass"}.content span.doc-label-namedtuple::after{content:"namedtuple"}.content span.doc-label-typeddict::after{content:"typeddict"}.content span.doc-label-protocol::after{content:"protocol"}.content span.doc-label-abc::after{content:"abc"}.content span.doc-label-enum::after{content:"enum"}.content span.doc-label-method::after{content:"method"}.content span.doc-label-classmethod::after{content:"classmethod"}.content span.doc-label-staticmethod::after{content:"staticmethod"}.content span.doc-label-function::after{content:"function"}.content span.doc-label-async::after{content:"async"}.content span.doc-label-exception::after{content:"exception"}.content span.doc-label-property::after{content:"property"}.content span.doc-label-constant::after{content:"constant"}.content span.doc-label-typealias::after{content:"typealias"}.content span.doc-label-cli::after{content:"cli"}.content span.doc-label-cli-group::after{content:"cli-group"}.content span.doc-label-mcp-tool::after{content:"mcp-tool"}.content span.doc-label-mcp-resource::after{content:"mcp-resource"}.content span.doc-label-mcp-resource-template::after{content:"mcp-resource-template"}.content span.doc-label-mcp-prompt::after{content:"mcp-prompt"}.content span.doc-label-mcp::after{content:"mcp"}.content span.doc-label-class::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-dataclass::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-namedtuple::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-typeddict::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-protocol::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-abc::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-enum::after{color:rgb(90.4,25.2,209.6);border-color:rgb(90.4,25.2,209.6);background-color:rgb(246.77,243.51,252.73)}.content span.doc-label-method::after{color:rgb(42.08,109.68,156.16);border-color:rgb(42.08,109.68,156.16);background-color:rgb(244.354,247.734,250.058)}.content span.doc-label-classmethod::after{color:rgb(42.08,109.68,156.16);border-color:rgb(42.08,109.68,156.16);background-color:rgb(244.354,247.734,250.058)}.content span.doc-label-staticmethod::after{color:rgb(42.08,109.68,156.16);border-color:rgb(42.08,109.68,156.16);background-color:rgb(244.354,247.734,250.058)}.content span.doc-label-function::after,.content span.doc-label-async::after{color:rgb(120.16,42.16,83.2);border-color:rgb(120.16,42.16,83.2);background-color:rgb(248.258,244.358,246.41)}.content span.doc-label-property::after{color:rgb(29.28,141.04,112.64);border-color:rgb(29.28,141.04,112.64);background-color:rgb(243.714,249.302,247.882)}.content span.doc-label-constant::after{color:rgb(211.2,113.2,32);border-color:rgb(211.2,113.2,32);background-color:rgb(252.81,247.91,243.85)}.content span.doc-label-typealias::after{color:rgb(203.2,137.2,30.4);border-color:rgb(203.2,137.2,30.4);background-color:rgb(252.41,249.11,243.77)}.content span.doc-label-cli::after{color:rgb(24.16,132.72,115.84);border-color:rgb(24.16,132.72,115.84);background-color:rgb(243.458,248.886,248.042)}.content span.doc-label-cli-group::after{content:"cli-group";color:rgb(24.16,132.72,115.84);border-color:rgb(24.16,132.72,115.84);background-color:rgb(243.458,248.886,248.042)}.content span.doc-label-mcp-tool::after{content:"tool";color:#e6194b;border-color:#e6194b;background-color:rgb(253.75,243.5,246)}.content span.doc-label-mcp-resource::after{content:"resource";color:#3cb44b;border-color:#3cb44b;background-color:rgb(245.25,251.25,246)}.content span.doc-label-mcp-resource-template::after{content:"resource template";color:#f032e6;border-color:#f032e6;background-color:rgb(254.25,244.75,253.75)}.content span.doc-label-mcp-prompt::after{content:"prompt";color:#4363d8;border-color:#4363d8;background-color:rgb(245.6,247.2,253.05)}.content span.doc-label-mcp::after{content:"mcp";color:rgb(79.84,54.64,139.52);border-color:rgb(79.84,54.64,139.52);background-color:rgb(246.242,244.982,249.226)}.mcp-capability-tiles{max-width:28rem;margin-bottom:1.5rem}.mcp-capability-tiles>p{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;margin:0;padding-top:10px}.mcp-tile{display:flex;align-items:center;justify-content:space-between;padding:.5rem .85rem;border-radius:.375rem;font-size:.875rem;font-weight:500;border:1px solid}.mcp-tile-label{flex:1}.mcp-tile-count{font-weight:700;font-size:1rem;margin-left:.5rem}.mcp-tile-tools{color:#e6194b;border-color:#e6194b;background-color:rgb(253,236.6,240.6)}.mcp-tile-resources{color:#3cb44b;border-color:#3cb44b;background-color:rgb(239.4,249,240.6)}.mcp-tile-templates{color:#f032e6;border-color:#f032e6;background-color:rgb(253.8,238.6,253)}.mcp-tile-prompts{color:#4363d8;border-color:#4363d8;background-color:rgb(239.96,242.52,251.88)}.mcp-tile-instructions{color:#f58231;border-color:#f58231;background-color:rgb(254.2,245,238.52)}.mcp-tile-completions{color:#911eb4;border-color:#911eb4;background-color:rgb(246.2,237,249)}span.doc-method-name::after,dt a.doc-method-name::after{content:"()"}[data-bs-theme=dark] .sidebar nav li>a>code{color:inherit;background-color:rgba(0,0,0,0)}[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code{color:#e2e8f0 !important;background-color:#2d3748 !important}[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code span{color:#e2e8f0 !important}[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code .doc-parameter-name{color:#f7fafc !important}[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code .doc-parameter-annotation,[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code .doc-parameter-annotation-sep,[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code .doc-parameter-default,[data-bs-theme=dark] :is(.doc-parameters,.doc-other-parameters,.doc-returns,.doc-yields,.doc-receives,.doc-raises,.doc-warns,.doc-attributes,.doc-parameter-attributes,.doc-init-parameters,.doc-see-also,.doc-examples) dt code .doc-parameter-default-sep{color:#cbd5e0 !important}[data-bs-theme=dark] .doc-signature div.sourceCode{background-color:#2d3748 !important}[data-bs-theme=dark] .doc-signature code{color:#e2e8f0 !important}[data-bs-theme=dark] .doc-signature code span:not(.sig-class,.sig-name,.cn-none,.cn-bool,.op){color:#e2e8f0 !important}[data-bs-theme=dark] .doc-signature.doc-attribute code{background-color:#2d3748 !important;color:#e2e8f0 !important}[data-bs-theme=dark] .doc-signature.doc-attribute .doc-parameter-name,[data-bs-theme=dark] .doc-signature.doc-attribute .doc-parameter-annotation-sep,[data-bs-theme=dark] .doc-signature.doc-attribute .doc-parameter-annotation{color:#fff !important}[data-bs-theme=dark] section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3){background-color:#422006 !important;border-color:#d97706 !important;color:#fef3c7 !important}[data-bs-theme=dark] section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3)>:is(h2,.h2,h3,.h3){color:#fbbf24 !important}[data-bs-theme=dark] section:has(>h2.doc-warnings,>.doc-warnings.h2,>h3.doc-warnings,>.doc-warnings.h3)>p{color:#fef3c7 !important}[data-bs-theme=dark] section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3){background-color:#1e3a5f !important;border-color:#3b82f6 !important;color:#dbeafe !important}[data-bs-theme=dark] section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3)>:is(h2,.h2,h3,.h3){color:#93c5fd !important}[data-bs-theme=dark] section:has(>h2.doc-notes,>.doc-notes.h2,>h3.doc-notes,>.doc-notes.h3)>p{color:#dbeafe !important}[data-bs-theme=dark] .callout{color:var(--bs-body-color) !important}[data-bs-theme=dark] .callout .callout-title-container{color:var(--bs-body-color) !important}[data-bs-theme=dark] .callout .callout-body p{color:var(--bs-body-color) !important}[data-bs-theme=dark] .quarto-post .listing-date,[data-bs-theme=dark] .quarto-post .listing-author{color:var(--bs-body-color)}[data-bs-theme=dark] .quarto-post .listing-title a{color:var(--bs-body-color)}html.theme-loading{visibility:hidden}html.theme-loading body{visibility:hidden}h2.title,.title.h2{margin-top:.5rem;border-bottom:none;padding-bottom:0}.table a,.doc-reference section.doc-group>dl a{text-underline-offset:4px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:inherit;font-weight:bold;font-size:.875em;word-break:initial;text-decoration-thickness:2px}code span.sig-class{color:#0e84b5;font-weight:600}code span.sig-name{color:#4758ab;font-weight:600}code span.cn-none{color:#7d4e9e;font-weight:500}code span.cn-bool{color:#07a;font-weight:600}#cb1 code span.op{color:#d14d00;font-weight:500}#cb1 code span.overload-spacer{display:block;height:.35em;user-select:none}.navbar-brand img{max-height:45px;padding-right:0px;margin-left:5px;margin-right:12px;transition:transform .3s ease}.navbar-brand img:hover{transform:scale(1.15)}body{background-color:var(--gd-bg-primary, #FCFEFF)}p a{color:#000;text-decoration:underline;text-underline-offset:4px}li a{color:#000;text-decoration:underline;text-underline-offset:4px}.column-margin a:has(.bi),.column-margin a:has(.fa-brands),.column-margin a:has(.ror-sidebar-icon){color:#495057;text-decoration:none}.column-margin a:has(.bi):hover,.column-margin a:has(.fa-brands):hover,.column-margin a:has(.ror-sidebar-icon):hover{color:#212529}@media(min-width: 992px){body.nav-sidebar.floating.fullcontent .page-columns{grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end] !important}main.content:has(.gd-meta-sidebar){position:relative;overflow:visible}.gd-meta-sidebar{position:absolute;top:0;left:100%;margin-left:1.5em;width:200px}.gd-meta-sidebar h3,.gd-meta-sidebar .h3,.gd-meta-sidebar h4,.gd-meta-sidebar .h4{font-size:.9em;font-weight:600;margin-top:.8em;margin-bottom:.25em;border-bottom:none;padding-bottom:0}.gd-meta-sidebar h3:first-child,.gd-meta-sidebar .h3:first-child,.gd-meta-sidebar h4:first-child,.gd-meta-sidebar .h4:first-child{margin-top:0}}@media(max-width: 991.98px){.gd-meta-sidebar{border-top:1px solid var(--bs-border-color, #dee2e6);padding-top:1em;margin-top:2em}}dt{min-height:32px;overflow-x:visible;margin-left:-4px}dd{padding-left:1.5rem}dd>p+ul,dd>p+ol{margin-top:-0.5em}dd>ul>li::marker,dd>ol>li::marker{color:#9ca3af}h2.doc-section,.doc-section.h2{font-size:22px;border-bottom:none;padding-bottom:0}.doc-section-parameters dd{padding-left:1.5rem;margin-left:0}.doc-section-parameters dd p{margin-left:0}.doc-section-warnings>h2,.doc-section-warnings>.h2{color:crimson;font-weight:600;margin-bottom:.5rem;border-left:none;border-bottom:none;padding-left:0}.doc-section-warnings>h2::before,.doc-section-warnings>.h2::before{content:"⚠️ "}.doc-section-warnings>p{margin:.5rem 0;padding:.75rem 1rem;background-color:#fef2f2;border-left:4px solid #dc2626;border-radius:4px;font-size:.9rem}.table td,.doc-reference section.doc-group>dl td{padding-left:.5rem;text-indent:0}code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.875em;color:#121212}.blockquote{font-size:13px;background-color:#e8e8e8;border-left-color:#4682b4}p,h1,.h1,h2,.h2,h3,.h3,#toc-title,#toc-function-reference,.nav-link,.table,.doc-reference section.doc-group>dl{font-family:"Open Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}.cell-output.cell-output-stdout{border-style:solid;border-width:1px;border-color:rgba(161,161,161,.3960784314);border-radius:4px;padding:.4em;background-color:rgba(247,241,235,.3960784314);margin-bottom:12px}summary::marker{font-size:1.5em}.parameter-name{margin-right:-10px}#toc-title>ul{font-size:14px}#TOC>ul.collapse{display:block !important;visibility:visible !important}#quarto-margin-sidebar{margin-left:20px;padding-top:30px}#quarto-margin-sidebar nav ul li{padding-top:3px;color:#595959}#quarto-margin-sidebar nav ul li a{color:#595959}#quarto-margin-sidebar nav ul li a:hover{color:#333}#quarto-margin-sidebar nav ul li a.active{color:#0d6efd;font-weight:500}#navbarCollapse>ul.navbar-nav.navbar-nav-scroll.me-auto>li>a:hover{background-color:#f07000;color:#fff;border-radius:5px}#navbarCollapse>ul.navbar-nav.navbar-nav-scroll.me-auto>li>a{color:var(--gd-navbar-text);font-weight:bold}a.sidebar-item-text.sidebar-link.text-start[data-bs-toggle=collapse]{pointer-events:none;cursor:default}a.sidebar-item-toggle.text-start{display:none !important}#quarto-sidebar ul.collapse.sidebar-section{display:block !important;visibility:visible !important;height:auto !important}div.sidebar-item-container{cursor:default !important}#quarto-sidebar .sidebar-link[href]{position:relative}#quarto-sidebar .sidebar-link[href]::before{content:"";position:absolute;inset:-3px -8px -3px -10px;border-radius:6px;opacity:0;transition:opacity .15s ease;pointer-events:none;background-color:rgba(0,0,0,.04);box-shadow:0 1px 4px rgba(0,0,0,.1)}#quarto-sidebar .sidebar-link[href]:hover::before{opacity:1}#quarto-sidebar a.sidebar-item-text.sidebar-link.active{color:#f47900;text-decoration:underline;text-decoration-thickness:3px;text-decoration-color:rgba(101,180,237,.75);text-underline-offset:3px}#api-reference>h1,#api-reference>.h1{margin:0}.navbar-title{font-family:Inter,Roboto,"Helvetica Neue","Arial Nova","Nimbus Sans",Arial,sans-serif;font-weight:bold;color:var(--gd-navbar-text);border-style:solid;border-width:2px;border-radius:8px;padding-left:10px;padding-right:10px;padding-top:3px;padding-bottom:4px}.version-badge{font-size:.65em;font-weight:500;color:rgba(0,0,0,.55);background-color:rgba(0,0,0,.08);border-radius:4px;padding:1px 6px;margin-left:6px;vertical-align:middle;letter-spacing:.02em;cursor:default}#quarto-sidebar{background-color:rgba(250,250,253,.3137254902)}@media(max-width: 991.98px){#quarto-sidebar{background-color:#fafafd}#quarto-sidebar.show{bottom:0;min-height:0;overflow-y:auto}#quarto-sidebar.sidebar-navigation.collapsing{transition:width .3s cubic-bezier(0.4, 0, 0.2, 1) !important;overflow:hidden}#quarto-sidebar.sidebar-navigation.collapsing>.sidebar-menu-container{min-width:280px}}@media(min-width: 992px){body.gd-section-no-sidebar #quarto-content{grid-template-columns:[screen-start] 1.5em [screen-start-inset] 4.65fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(1050px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end] !important}}#quarto-sidebar .sidebar-item-text{font-family:"Open Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:.85em;display:block;max-width:100%;white-space:normal;hyphens:none}a.sidebar-item-text.sidebar-link.text-start>span{text-transform:uppercase;font-weight:600;color:dimgray;font-family:"Open Sans",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1em;hyphens:none}.sidebar-menu-container{border-bottom-style:solid;border-bottom-width:3px;border-bottom-color:#e7eaf6}#quarto-sidebar .sidebar-item .menu-text{font-size:15px}.gd-ref-sidebar #quarto-sidebar .sidebar-item .menu-text{font-size:12px}.sidebar-item-section{padding-bottom:8px}@media(min-width: 992px){#quarto-sidebar.gd-sidebar-float{display:flex;flex-direction:column;overflow:hidden !important;position:sticky;transition:top .15s ease,max-height .15s ease;margin-right:-12px;align-self:start}#quarto-sidebar.gd-sidebar-float .sidebar-menu-container{border-bottom:none}#quarto-sidebar.gd-sidebar-float .sidebar-menu-container>ul{margin-bottom:0}#quarto-sidebar.gd-sidebar-float .sidebar-menu-container>ul>li:last-child{padding-bottom:7px}#quarto-sidebar.gd-sidebar-float .sidebar-item{margin-top:.1rem;margin-bottom:.1em}#quarto-sidebar.gd-sidebar-float .sidebar-link[href]::before{display:none !important;content:none !important}#quarto-sidebar.gd-sidebar-float .sidebar-link[href]{border-radius:6px;padding-left:8px;padding-right:8px;padding-top:3px;padding-bottom:3px;margin-left:-8px;margin-right:0;transition:background-color .15s ease,box-shadow .15s ease}#quarto-sidebar.gd-sidebar-float .sidebar-link[href]:hover{background-color:rgba(0,0,0,.04);box-shadow:0 1px 4px rgba(0,0,0,.1)}#quarto-sidebar.gd-sidebar-float.sidebar-navigation>*{padding-top:.4em}#quarto-sidebar.gd-sidebar-float>*{padding-right:0}}.gd-sidebar-float-body{display:none}@media(min-width: 992px){.gd-sidebar-float-body{display:block;flex:1 1 auto;overflow-y:auto;overscroll-behavior:contain;position:relative;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.15) rgba(0,0,0,0)}.gd-sidebar-float-body::-webkit-scrollbar{width:5px}.gd-sidebar-float-body::-webkit-scrollbar-track{background:rgba(0,0,0,0)}.gd-sidebar-float-body::-webkit-scrollbar-thumb{background:rgba(0,0,0,.12);border-radius:4px}}.gd-sidebar-scroll-indicator{display:none}@media(min-width: 992px){.gd-sidebar-scroll-indicator{display:flex;align-items:center;justify-content:center;position:sticky;left:0;right:0;min-height:32px;margin-top:-32px;pointer-events:none;opacity:0;transition:opacity .2s ease;z-index:3}.gd-sidebar-scroll-indicator.visible{opacity:1;pointer-events:auto;cursor:pointer}.gd-sidebar-scroll-top{top:0;background:linear-gradient(to bottom, rgba(250, 250, 253, 0.92) 0%, transparent 100%)}.gd-sidebar-scroll-bottom{bottom:0;position:sticky;margin-top:0;margin-bottom:-32px;background:linear-gradient(to top, rgba(250, 250, 253, 0.92) 0%, transparent 100%)}.gd-sidebar-scroll-arrow{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:rgba(0,0,0,.06);color:#6c757d;font-size:.65rem;line-height:1;transition:background .15s ease,color .15s ease}.gd-sidebar-scroll-indicator:hover .gd-sidebar-scroll-arrow{background:rgba(0,0,0,.12);color:#343a40}}@media(min-width: 992px){body.quarto-dark #quarto-sidebar.gd-sidebar-float{background:rgba(30,30,30,.55);border-color:hsla(0,0%,100%,.1);box-shadow:0 1px 6px rgba(0,0,0,.25)}body.quarto-dark .gd-sidebar-float-body{scrollbar-color:hsla(0,0%,100%,.15) rgba(0,0,0,0)}body.quarto-dark .gd-sidebar-float-body::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.12)}body.quarto-dark #quarto-sidebar.gd-sidebar-float .sidebar-link[href]:hover{background-color:hsla(0,0%,100%,.08);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.12)}body.quarto-dark .gd-sidebar-scroll-top{background:linear-gradient(to bottom, rgba(30, 30, 30, 0.92) 0%, transparent 100%)}body.quarto-dark .gd-sidebar-scroll-bottom{background:linear-gradient(to top, rgba(30, 30, 30, 0.92) 0%, transparent 100%)}body.quarto-dark .gd-sidebar-scroll-arrow{background:hsla(0,0%,100%,.08);color:#ced4da}body.quarto-dark .gd-sidebar-scroll-indicator:hover .gd-sidebar-scroll-arrow{background:hsla(0,0%,100%,.15);color:#ecf0f1}}@media print{.gd-sidebar-scroll-indicator{display:none !important}}#quarto-header>nav>div{margin-left:2%;margin-right:2%}.navbar{background:var(--gd-navbar-bg);border-bottom:1px solid rgba(0,0,0,.08)}.nav-link.active{text-decoration:underline;text-decoration-thickness:2px;text-decoration-color:rgba(101,180,237,.75);text-underline-offset:4px}body.quarto-light .navbar .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0,0,0,0.65)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}#gd-navbar-widgets{display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:fit-content;flex-wrap:nowrap}@media(max-width: 430px){.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl,.navbar .container-xxl{flex-wrap:wrap}.navbar-brand.navbar-brand-logo{padding-right:100%}.quarto-navbar-tools{flex:0 0 100%;justify-content:center;order:99;padding-top:4px;padding-bottom:4px}#gd-navbar-widgets{justify-content:center}}#gd-navbar-widgets>#dark-mode-toggle-container,#gd-navbar-widgets>#gd-keyboard-btn-container{display:flex;align-items:center;justify-content:center;margin:0}#gd-navbar-widgets #quarto-search{margin-left:0;order:unset}#gd-navbar-widgets #quarto-search.type-overlay .aa-Autocomplete{width:34px}#quarto-search .aa-DetachedSearchButton{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease}#quarto-search .aa-DetachedSearchButton:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}#quarto-search .aa-DetachedSearchButton:focus{outline:none;box-shadow:0 0 0 2px rgba(0,0,0,.15)}#quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon{display:flex;align-items:center;justify-content:center}.navbar #quarto-search.type-overlay .aa-Autocomplete svg.aa-SubmitIcon{width:20px;height:20px;margin:0;color:currentColor}#quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonPlaceholder{display:none}body.quarto-light .navbar .aa-DetachedSearchButton svg,body.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,body.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,body.quarto-light .navbar .aa-DetachedSearchButton .aa-SearchIcon,html.quarto-light .navbar .aa-DetachedSearchButton svg,html.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,html.quarto-light .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,html.quarto-light .navbar .aa-DetachedSearchButton .aa-SearchIcon,:root[data-bs-theme=light] .navbar .aa-DetachedSearchButton svg,:root[data-bs-theme=light] .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,:root[data-bs-theme=light] .navbar .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,:root[data-bs-theme=light] .navbar .aa-DetachedSearchButton .aa-SearchIcon,body.quarto-light .navbar .aa-SubmitButton,body.quarto-light .navbar .aa-SubmitButton svg{color:var(--gd-navbar-text) !important;fill:var(--gd-navbar-text)}body.quarto-light .navbar .quarto-navbar-tools button,body.quarto-light .navbar .quarto-navbar-tools .quarto-navigation-tool{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease}body.quarto-light .navbar .quarto-navbar-tools button:hover,body.quarto-light .navbar .quarto-navbar-tools .quarto-navigation-tool:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}body.quarto-light .navbar .nav-item.compact .nav-link,body.quarto-light .navbar .gd-navbar-icon{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease}body.quarto-light .navbar .nav-item.compact .nav-link:hover,body.quarto-light .navbar .gd-navbar-icon:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}#navbarCollapse>ul.navbar-nav.navbar-nav-scroll.ms-auto>li{padding-right:5px}.shrink-example .cell-output table{zoom:60%}.scale-to-fit{width:100%;position:relative}.scale-to-fit .gd-scale-wrapper{transform-origin:top left}.scale-to-fit.gd-scale-scrollable{overflow-x:auto;-webkit-overflow-scrolling:touch}footer.footer .nav-footer{margin-top:10px}.nav-footer{position:relative;z-index:1;border-top-style:solid;border-top-width:1px;border-top-color:rgba(170,170,170,.2509803922)}.nav-footer-left{color:#303030}.nav-footer-center{color:#303030;text-wrap:balance;padding-bottom:20px}.nav-footer-right{color:#303030}@media(min-width: 992px){.nav-footer{padding-left:calc((100vw - 900px)/2);padding-right:calc((100vw - 900px)/2)}.nav-footer-center{margin-top:.5rem}}@media(min-width: 1200px){.nav-footer{padding-left:calc((100vw - 1100px)/2);padding-right:calc((100vw - 1100px)/2)}}@media(min-width: 1400px){.nav-footer{padding-left:calc((100vw - 1300px)/2);padding-right:calc((100vw - 1300px)/2)}}.nav-footer-center a{color:inherit;text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px}.nav-footer-center a:hover{text-decoration-thickness:2px}.nav-page.nav-page-previous a,.nav-page.nav-page-next a{border-style:solid;padding-left:.5rem;border-radius:8px;padding-right:.5rem;border-width:1px;margin-left:.5rem;margin-right:.5rem}.nav-page-text{font-size:.875em;position:relative;top:-1px}@media(max-width: 576px){.page-navigation{flex-direction:column;align-items:center;gap:.5rem}.nav-page.nav-page-previous,.nav-page.nav-page-next{width:auto;text-align:center}}.source-link{font-size:12px;font-weight:600;color:#4682b4 !important;text-decoration:underline !important;text-underline-offset:3px;text-decoration-thickness:1.5px;letter-spacing:.5px;transition:color .2s ease}.source-link:hover{color:#2a5f8a !important;text-decoration-thickness:2px}.usage-source-row{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:-14px}.code-copy-outer-scaffold>.usage-source-row{position:relative;z-index:1}.code-copy-outer-scaffold{position:relative}div.sourceCode{overflow:visible;position:relative}div.sourceCode>pre{overflow-x:auto}.gd-code-nav{position:absolute;top:0;right:0;z-index:3;padding:.35rem}.gd-code-copy{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:1px solid rgba(0,0,0,0);border-radius:4px;background:rgba(0,0,0,0);color:#6c757d;cursor:pointer;opacity:.25;transition:opacity .15s ease,background-color .15s ease,color .15s ease,border-color .15s ease}.code-copy-outer-scaffold:hover .gd-code-copy,div.sourceCode:hover>.gd-code-nav .gd-code-copy,.gd-code-copy:focus-visible{opacity:1}.gd-code-copy:hover{background-color:rgba(0,0,0,.06);border-color:rgba(0,0,0,.1);color:#495057}.gd-code-copy.gd-code-copied{opacity:1;color:#198754}.code-copy-button{display:none !important}@media(max-width: 991.98px){#quarto-header>.navbar .container-fluid.d-flex,#quarto-header>.navbar .d-flex.container-sm,#quarto-header>.navbar .d-flex.container-md,#quarto-header>.navbar .d-flex.container-lg,#quarto-header>.navbar .d-flex.container-xl,#quarto-header>.navbar .d-flex.container-xxl{margin-left:0;padding-left:5px}.quarto-secondary-nav .container-fluid.d-flex,.quarto-secondary-nav .d-flex.container-sm,.quarto-secondary-nav .d-flex.container-md,.quarto-secondary-nav .d-flex.container-lg,.quarto-secondary-nav .d-flex.container-xl,.quarto-secondary-nav .d-flex.container-xxl{align-items:center;padding-left:1rem}.quarto-secondary-nav-title{padding-top:0;margin-bottom:.5rem;padding-left:.5rem}.gd-ref-title{display:flex;align-items:center;gap:0;padding-top:0;padding-left:.5rem;color:#212529;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gd-ref-title-prefix{font-weight:600;color:#495057;flex-shrink:0}.gd-ref-title-sep{margin:0 .4em;color:#adb5bd;flex-shrink:0}.gd-ref-title-name{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:18px;color:#495057;overflow:hidden;text-overflow:ellipsis;position:relative;top:2px}body.quarto-dark .gd-ref-title{color:#868e96}body.quarto-dark .gd-ref-title-prefix,body.quarto-dark .gd-ref-title-name{color:#ced4da}body.quarto-dark .gd-ref-title-sep{color:#6c757d}.quarto-secondary-nav .quarto-btn-toggle{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:#495057;cursor:pointer;transition:all .2s ease;margin-right:6px;flex-shrink:0}.quarto-secondary-nav .quarto-btn-toggle .bi{font-size:1.15rem;line-height:1}.quarto-secondary-nav .quarto-btn-toggle:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}.quarto-secondary-nav .quarto-btn-toggle:focus{outline:none;box-shadow:0 0 0 2px rgba(0,0,0,.15)}body.quarto-dark .quarto-secondary-nav .quarto-btn-toggle{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.18);color:#dee2e6}body.quarto-dark .quarto-secondary-nav .quarto-btn-toggle:hover{background:hsla(0,0%,100%,.14);border-color:hsla(0,0%,100%,.28)}body.quarto-dark .quarto-secondary-nav .quarto-btn-toggle:focus{box-shadow:0 0 0 2px hsla(0,0%,100%,.2)}#quarto-document-content{display:flex;flex-direction:column}.column-margin{order:2;margin-top:2rem;padding:.75rem 1.5rem 1.5rem 1.5rem;background-color:#f8f9fa;border-radius:8px;border:1px solid #e9ecef}.column-margin>div>section:first-child>h3,.column-margin>div>section:first-child>.h3{margin-top:.5em}.column-margin,.column-margin>*,.column-margin section,.column-margin p,.column-margin code{background-color:#f8f9fa}#quarto-document-content>*:not(.column-margin){order:1}.column-margin h4,.column-margin .h4{font-size:.9rem;color:#495057;border-bottom:1px solid #dee2e6;padding-bottom:.5rem;margin-top:1rem}.column-margin h4:first-child,.column-margin .h4:first-child{margin-top:0}#quarto-content{padding-left:12px;padding-right:12px}}#github-widget{position:relative;display:inline-flex;align-items:center}.gh-widget-trigger{display:flex;align-items:center;gap:6px;padding:6px 10px;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease;font-size:13px}.gh-widget-trigger:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}.gh-widget-open .gh-widget-trigger{background:rgba(0,0,0,.12);border-color:rgba(0,0,0,.25)}.gh-icon{flex-shrink:0}.gh-stats{display:flex;align-items:center;gap:10px;margin-left:4px}.gh-stat{display:flex;align-items:center;gap:3px;font-weight:500}.gh-stat svg{opacity:.85}.gh-count{min-width:16px;text-align:center}.gh-dropdown-arrow{margin-left:2px;opacity:.7;transition:transform .2s ease}.gh-widget-open .gh-dropdown-arrow{transform:rotate(180deg)}.gh-dropdown{position:absolute;top:calc(100% + 6px);right:0;min-width:180px;background:#fff;border:1px solid #d0d7de;border-radius:8px;box-shadow:0 8px 24px rgba(31,35,40,.12);opacity:0;visibility:hidden;transform:translateY(-8px);transition:all .2s ease;z-index:1000;overflow:hidden}.gh-widget-open .gh-dropdown{opacity:1;visibility:visible;transform:translateY(0)}.gh-dropdown-item{display:flex;align-items:center;gap:10px;padding:10px 14px;color:#24292f !important;text-decoration:none !important;font-size:14px;font-weight:500;transition:background .15s ease}.gh-dropdown-item:hover{background:#f6f8fa;text-decoration:none !important}.gh-dropdown-item svg{color:#57606a;flex-shrink:0}.gh-dropdown-divider{height:1px;margin:4px 0;background:#d8dee4}.gh-badge{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;margin-left:auto;background:#ddf4ff;color:#0969da;border-radius:10px;font-size:12px;font-weight:600}.gd-version-selector{position:relative;display:flex;align-items:center}.gd-vs-trigger{display:flex;align-items:center;gap:6px;padding:6px 10px;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease;font-size:13px;font-weight:500;white-space:nowrap}.gd-vs-trigger:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}.gd-vs-open .gd-vs-trigger{background:rgba(0,0,0,.12);border-color:rgba(0,0,0,.25)}.gd-vs-icon{flex-shrink:0;width:20px;height:20px}.gd-vs-label{line-height:1}.gd-vs-arrow{margin-left:2px;opacity:.7;transition:transform .2s ease}.gd-vs-open .gd-vs-arrow{transform:rotate(180deg)}.gd-vs-dropdown{position:absolute;top:calc(100% + 6px);right:0;min-width:170px;background:#fff;border:1px solid #d0d7de;border-radius:8px;box-shadow:0 8px 24px rgba(31,35,40,.12);opacity:0;visibility:hidden;transform:translateY(-8px);transition:all .2s ease;z-index:1000;overflow:hidden}.gd-vs-open .gd-vs-dropdown{opacity:1;visibility:visible;transform:translateY(0)}.gd-vs-item{display:flex;align-items:center;gap:8px;padding:8px 14px;color:#24292f !important;text-decoration:none !important;font-size:14px;font-weight:500;transition:background .15s ease}.gd-vs-item:hover{background:#f6f8fa}.gd-vs-item-active{background:#f0f6ff;font-weight:600}.gd-vs-badge{display:inline-flex;align-items:center;justify-content:center;width:16px;font-size:12px;flex-shrink:0}.gd-vs-badge-spacer{display:inline-block;width:16px;flex-shrink:0}.gd-vs-badge-pre{color:#9a6700}.gd-vs-badge-eol{color:#cf222e}.gd-vs-check{margin-left:auto;color:#1a7f37;font-size:12px;flex-shrink:0}@media(max-width: 991.98px){.gd-vs-label{display:none}}.gd-version-banner{padding:10px 20px;font-size:14px;text-align:center;font-weight:500;border-bottom:1px solid}.gd-version-banner a{font-weight:600;text-decoration:underline;margin-left:4px}.gd-version-banner-old{background:#fff8c5;color:#4d2d00;border-color:#d4a72c}.gd-version-banner-old a{color:#4d2d00}.gd-version-banner-pre{background:#ddf4ff;color:#0550ae;border-color:#54aeff}.gd-version-banner-pre a{color:#0550ae}.gd-version-banner-eol{background:#ffebe9;color:#82071e;border-color:#ff8182}.gd-version-banner-eol a{color:#82071e}body.quarto-dark .gd-vs-trigger,html.quarto-dark .gd-vs-trigger,:root[data-bs-theme=dark] .gd-vs-trigger{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.15)}body.quarto-dark .gd-vs-trigger:hover,html.quarto-dark .gd-vs-trigger:hover,:root[data-bs-theme=dark] .gd-vs-trigger:hover{background:hsla(0,0%,100%,.14);border-color:hsla(0,0%,100%,.25)}body.quarto-dark .gd-vs-dropdown,html.quarto-dark .gd-vs-dropdown,:root[data-bs-theme=dark] .gd-vs-dropdown{background:var(--gd-bg-secondary);border-color:var(--gd-border-color);box-shadow:0 8px 24px rgba(0,0,0,.4)}body.quarto-dark .gd-vs-item,html.quarto-dark .gd-vs-item,:root[data-bs-theme=dark] .gd-vs-item{color:#adbac7 !important}body.quarto-dark .gd-vs-item:hover,html.quarto-dark .gd-vs-item:hover,:root[data-bs-theme=dark] .gd-vs-item:hover{background:#373e47}body.quarto-dark .gd-vs-item-active,html.quarto-dark .gd-vs-item-active,:root[data-bs-theme=dark] .gd-vs-item-active{background:#1c3049}body.quarto-dark .gd-vs-check,html.quarto-dark .gd-vs-check,:root[data-bs-theme=dark] .gd-vs-check{color:#57ab5a}body.quarto-dark .gd-version-banner-old,html.quarto-dark .gd-version-banner-old,:root[data-bs-theme=dark] .gd-version-banner-old{background:#3d2e00;color:#e3b341;border-color:#5c4400}body.quarto-dark .gd-version-banner-old a,html.quarto-dark .gd-version-banner-old a,:root[data-bs-theme=dark] .gd-version-banner-old a{color:#e3b341}body.quarto-dark .gd-version-banner-pre,html.quarto-dark .gd-version-banner-pre,:root[data-bs-theme=dark] .gd-version-banner-pre{background:#0d2137;color:#539bf5;border-color:#1b3a57}body.quarto-dark .gd-version-banner-pre a,html.quarto-dark .gd-version-banner-pre a,:root[data-bs-theme=dark] .gd-version-banner-pre a{color:#539bf5}body.quarto-dark .gd-version-banner-eol,html.quarto-dark .gd-version-banner-eol,:root[data-bs-theme=dark] .gd-version-banner-eol{background:#3c1118;color:#f47067;border-color:#5c1a23}body.quarto-dark .gd-version-banner-eol a,html.quarto-dark .gd-version-banner-eol a,:root[data-bs-theme=dark] .gd-version-banner-eol a{color:#f47067}.gd-badge{display:inline-block;font-size:.7em;font-weight:600;line-height:1;padding:3px 8px;border-radius:10px;vertical-align:middle;margin-left:6px;white-space:nowrap;letter-spacing:.01em}.gd-badge-new{background:#dafbe1;color:#1a7f37;border:1px solid #a6e3b0}.gd-badge-changed{background:#ddf4ff;color:#0550ae;border:1px solid #80ccff}.gd-badge-deprecated{background:#ffebe9;color:#82071e;border:1px solid #ffb8b0}body.quarto-dark .gd-badge-new,html.quarto-dark .gd-badge-new,:root[data-bs-theme=dark] .gd-badge-new{background:#0d3117;color:#57ab5a;border-color:#1b4b27}body.quarto-dark .gd-badge-changed,html.quarto-dark .gd-badge-changed,:root[data-bs-theme=dark] .gd-badge-changed{background:#0d2137;color:#539bf5;border-color:#1b3a57}body.quarto-dark .gd-badge-deprecated,html.quarto-dark .gd-badge-deprecated,:root[data-bs-theme=dark] .gd-badge-deprecated{background:#3c1118;color:#f47067;border-color:#5c1a23}@media(max-width: 991.98px){#quarto-header>nav>div{margin-left:0%;margin-right:0%}.container,.container-fluid,.container-sm,.container-md,.container-lg,.container-xl,.container-xxl{padding-right:calc(var(--bs-gutter-x)*.15);padding-left:calc(var(--bs-gutter-x)*.15)}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.4rem;padding-right:.6rem;margin-left:-0.2rem}#gd-navbar-widgets{gap:4px;margin-left:auto}.gh-widget-trigger{width:100%;justify-content:flex-start}}@media(max-width: 991.98px){#supported-by-posit{display:none !important}}@media(max-width: 767.98px){body .page-columns{grid-template-columns:[screen-start] .5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] .5em [screen-end] !important}}@media(max-width: 768px){.gh-stats{display:none}.gh-widget-trigger{padding:6px 8px}.gh-dropdown{right:0;min-width:160px}}#quarto-header,#quarto-header nav,#quarto-header .navbar,#quarto-header .container-fluid,#quarto-header .container-sm,#quarto-header .container-md,#quarto-header .container-lg,#quarto-header .container-xl,#quarto-header .container-xxl,.navbar-nav.ms-auto,.navbar-nav.ms-auto>li,.navbar-nav.ms-auto>li>.nav-link{overflow:visible !important}#navbarCollapse>ul.navbar-nav.navbar-nav-scroll.me-auto{text-wrap:nowrap;overflow-x:auto !important}@media print{#github-widget{display:none}}.reference-switcher-container{margin-left:0;margin-right:.6rem;margin-bottom:.2rem;padding-top:1.25rem;padding-bottom:.6rem;border-bottom:1px solid rgba(0,0,0,.06);background:rgba(0,0,0,0)}.reference-switcher{display:flex;gap:.25rem;background:#f0f0f0;border-radius:6px;padding:.2rem}.reference-switcher-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:.35rem;padding:.35rem .5rem;border:none;border-radius:4px;background:rgba(0,0,0,0);color:#666;font-size:.8rem;font-weight:500;cursor:pointer;transition:all .15s ease}.reference-switcher-btn:hover{background:hsla(0,0%,100%,.5);color:#333}.reference-switcher-btn.active{background:#fff;color:#333;box-shadow:0 1px 3px rgba(0,0,0,.1)}.reference-switcher-btn i{font-size:.9rem}body.quarto-dark .reference-switcher{background:#2a2a2a}body.quarto-dark .reference-switcher-btn{color:#999}body.quarto-dark .reference-switcher-btn:hover{background:hsla(0,0%,100%,.1);color:#ccc}body.quarto-dark .reference-switcher-btn.active{background:#3a3a3a;color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3)}.reference-switcher-dropdown{position:relative}.reference-switcher-dropdown-toggle{display:flex;align-items:center;gap:.4rem;width:100%;padding:.4rem .6rem;border:1px solid rgba(0,0,0,.1);border-radius:6px;background:#f8f8f8;color:#333;font-size:.8rem;font-weight:500;cursor:pointer;transition:border-color .15s ease,background .15s ease}.reference-switcher-dropdown-toggle:hover{border-color:rgba(0,0,0,.2);background:#f0f0f0}.reference-switcher-dropdown-toggle i{font-size:.9rem;opacity:.7}.reference-switcher-dropdown-label{flex:1;text-align:left}.reference-switcher-chevron{opacity:.5;transition:transform .15s ease}.reference-switcher-dropdown-toggle[aria-expanded=true] .reference-switcher-chevron{transform:rotate(180deg)}.reference-switcher-dropdown-menu{display:none;position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:100;margin:0;padding:.25rem;list-style:none;background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.1)}.reference-switcher-dropdown-menu.show{display:block}.reference-switcher-dropdown-item{display:flex;align-items:center;gap:.4rem;padding:.4rem .6rem;border-radius:4px;font-size:.8rem;font-weight:500;color:#555;cursor:pointer;transition:background .1s ease,color .1s ease}.reference-switcher-dropdown-item:hover{background:#f0f0f0;color:#333}.reference-switcher-dropdown-item.active{background:#e8f0fe;color:#1a73e8}.reference-switcher-dropdown-item i{font-size:.9rem;opacity:.7}body.quarto-dark .reference-switcher-dropdown-toggle{background:#2a2a2a;border-color:hsla(0,0%,100%,.1);color:#e0e0e0}body.quarto-dark .reference-switcher-dropdown-toggle:hover{background:#333;border-color:hsla(0,0%,100%,.2)}body.quarto-dark .reference-switcher-dropdown-menu{background:#2a2a2a;border-color:hsla(0,0%,100%,.1);box-shadow:0 4px 12px rgba(0,0,0,.4)}body.quarto-dark .reference-switcher-dropdown-item{color:#999}body.quarto-dark .reference-switcher-dropdown-item:hover{background:hsla(0,0%,100%,.08);color:#e0e0e0}body.quarto-dark .reference-switcher-dropdown-item.active{background:rgba(138,180,248,.15);color:#8ab4f8}.sidebar-filter-container{padding:.35rem .65rem .65rem 0rem;border-bottom:1px solid rgba(0,0,0,.05);background:rgba(0,0,0,0);position:sticky;top:0;z-index:10}.sidebar-filter-wrapper{position:relative;display:flex;align-items:center}.sidebar-filter-input{width:100%;padding:.3rem 1.75rem .3rem 1.85rem;font-size:.8rem;border:1px solid #e9e9e9;border-radius:4px;background-color:#fff;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,background-color .15s ease-in-out}.sidebar-filter-input:focus{outline:none;border-color:#86b7fe;box-shadow:0 0 0 .15rem rgba(13,110,253,.12);background-color:#fff}.sidebar-filter-input::placeholder{color:#999;opacity:1}.sidebar-filter-icon{position:absolute;left:.55rem;top:50%;transform:translateY(-50%);color:#999;pointer-events:none;font-size:.75rem;display:flex;align-items:center;justify-content:center}.sidebar-filter-clear{position:absolute;right:.35rem;top:50%;transform:translateY(-50%);background:none;border:none;color:#999;cursor:pointer;padding:.15rem;line-height:1;border-radius:3px;transition:color .15s ease,background-color .15s ease;font-size:.7rem}.sidebar-filter-clear:hover{color:#666;background-color:rgba(0,0,0,.04)}.sidebar-filter-count{font-size:.7rem;color:#888;text-align:center;margin-top:.25rem;padding:.1rem .4rem;background:rgba(0,0,0,0);border-radius:3px}.sidebar-filter-count .filter-count-num{font-weight:600;color:#666}.sidebar-item.sidebar-filter-match .sidebar-link{background-color:rgba(255,243,205,.5)}.sidebar-item{transition:opacity .15s ease}@media(max-width: 991.98px){.sidebar-filter-container{padding:.4rem .65rem}.sidebar-filter-input{font-size:.85rem;padding:.35rem 1.75rem .35rem 1.85rem}}body.quarto-dark .sidebar-filter-container{background:rgba(0,0,0,0);border-bottom-color:hsla(0,0%,100%,.08)}body.quarto-dark .sidebar-filter-input{background-color:#2a2a2a;border-color:#3d3d3d;color:#e0e0e0}body.quarto-dark .sidebar-filter-input:focus{border-color:#6ea8fe;box-shadow:0 0 0 .15rem rgba(13,110,253,.25);background-color:#333}body.quarto-dark .sidebar-filter-input::placeholder{color:#9e9e9e}body.quarto-dark .sidebar-filter-icon,body.quarto-dark .sidebar-filter-clear{color:#9e9e9e}body.quarto-dark .sidebar-filter-clear:hover{color:#e0e0e0;background-color:hsla(0,0%,100%,.1)}body.quarto-dark .sidebar-filter-count{color:#9e9e9e}body.quarto-dark .sidebar-filter-count .filter-count-num{color:#e0e0e0}body.quarto-dark .sidebar-item.sidebar-filter-match .sidebar-link{background-color:rgba(255,193,7,.2)}h1.title.cli-title,.title.cli-title.h1{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1.25rem;font-weight:600}.cli-manpage{width:100%}.cli-manpage pre{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:13px;line-height:1.6;background:#012b15;color:#d4d4d4;border:none;border-radius:6px;padding:1.25rem 1.5rem;overflow-x:auto;white-space:pre;margin-bottom:1rem;max-width:100%}.cli-manpage pre code{font-family:inherit;font-size:inherit;background:rgba(0,0,0,0);color:inherit;padding:0;white-space:pre}[data-bs-theme=light] .cli-manpage pre{background:#1e1e1e;color:#d4d4d4}@media(min-width: 992px)and (max-width: 1199.98px){.cli-manpage{margin-top:1.5rem}}@media(min-width: 1200px){.cli-manpage{margin-top:1.5rem}}@media(min-width: 768px)and (max-width: 991.98px){.cli-manpage{margin-top:1.5rem}.cli-manpage pre{font-size:12px;padding:1rem 1.25rem;border-radius:4px}h1.title.cli-title,.title.cli-title.h1{font-size:1.1rem}}@media(max-width: 767.98px){.cli-manpage{margin-top:1.5rem}.cli-manpage pre{font-size:11px;padding:.875rem 1rem;line-height:1.5}h1.title.cli-title,.title.cli-title.h1{font-size:1rem}}@media(max-width: 575.98px){.cli-manpage{margin-top:1.5rem}.cli-manpage pre{font-size:10px;padding:.75rem .875rem;border-radius:3px}h1.title.cli-title,.title.cli-title.h1{font-size:.95rem}}.nav-item:has(#gd-keyboard-btn-container){display:flex;align-items:center}#gd-keyboard-btn-container{display:flex;align-items:center;justify-content:center;margin-right:2px}.gd-keyboard-btn{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease}.gd-keyboard-btn:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}.gd-keyboard-btn:focus{outline:none;box-shadow:0 0 0 2px rgba(0,0,0,.15)}.gd-keyboard-btn svg{display:block}@media(max-width: 991.98px){#gd-navbar-widgets>#gd-keyboard-btn-container,#gd-keyboard-btn-container{display:none}}body.quarto-dark .gd-keyboard-btn{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.18);color:#f8f9fa}body.quarto-dark .gd-keyboard-btn:hover{background:hsla(0,0%,100%,.14);border-color:hsla(0,0%,100%,.28)}body.quarto-dark .gd-keyboard-btn:focus{box-shadow:0 0 0 2px hsla(0,0%,100%,.2)}.nav-item:has(#dark-mode-toggle-container){display:flex;align-items:center}#dark-mode-toggle-container{display:flex;align-items:center;justify-content:center;margin-right:0}.dark-mode-toggle{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:rgba(0,0,0,.06);border:1px solid rgba(0,0,0,.15);border-radius:6px;color:var(--gd-navbar-text);cursor:pointer;transition:all .2s ease}.dark-mode-toggle:hover{background:rgba(0,0,0,.1);border-color:rgba(0,0,0,.25)}.dark-mode-toggle:focus{outline:none;box-shadow:0 0 0 2px rgba(0,0,0,.15)}.dark-mode-toggle svg{display:block}.theme-icon-light,.theme-icon-dark{display:flex;align-items:center;justify-content:center}:root{--gd-bg-primary: #FCFEFF;--gd-bg-secondary: #FAFAFD;--gd-bg-tertiary: #F7F1EB;--gd-text-primary: rgb(18, 18, 18);--gd-text-secondary: #333;--gd-text-muted: #666;--gd-border-color: #e9e9e9;--gd-border-light: #E7EAF6;--gd-link-color: black;--gd-code-bg: #f8f9fa;--gd-code-color: rgb(18, 18, 18);--gd-blockquote-bg: #E8E8E8;--gd-sidebar-bg: #FAFAFD;--gd-navbar-bg: #f0f0f0;--gd-navbar-text: #2d2d2d;--gd-footer-text: rgb(48, 48, 48);--gd-highlight-color: rgba(255, 243, 205, 0.5);--gd-active-link: rgb(244, 121, 0);--gd-accent-blue: rgba(101, 180, 237, 0.75);--gd-syn-class: #0e84b5;--gd-syn-name: #4758AB;--gd-syn-none: #7D4E9E;--gd-syn-bool: #0077AA;--gd-syn-operator: #D14D00;--gd-syn-keyword: #008000;--gd-syn-string: #BA2121;--gd-syn-number: #666666;--gd-syn-comment: #408080;--gd-syn-function: #0000FF;--gd-syn-builtin: #008000}html.quarto-dark,body.quarto-dark{--gd-bg-primary: #1a1a1a;--gd-bg-secondary: #222222;--gd-bg-tertiary: #2a2a2a;--gd-text-primary: #e0e0e0;--gd-text-secondary: #c8c8c8;--gd-text-muted: #999;--gd-border-color: #3d3d3d;--gd-border-light: #333;--gd-link-color: #7cb8e8;--gd-code-bg: #2a2a2a;--gd-code-color: #e0e0e0;--gd-blockquote-bg: #2a2a2a;--gd-sidebar-bg: #1e1e1e;--gd-navbar-bg: #1a1a1a;--gd-navbar-text: #e0e0e0;--gd-footer-text: #b0b0b0;--gd-highlight-color: rgba(255, 193, 7, 0.2);--gd-active-link: #ff9f43;--gd-accent-blue: rgba(101, 180, 237, 0.6);--gd-syn-class: #56c8ff;--gd-syn-name: #8cb4ff;--gd-syn-none: #c792ea;--gd-syn-bool: #56c8ff;--gd-syn-operator: #ff9f43;--gd-syn-keyword: #c792ea;--gd-syn-string: #c3e88d;--gd-syn-number: #f78c6c;--gd-syn-comment: #8891b3;--gd-syn-function: #82aaff;--gd-syn-builtin: #ffcb6b}body.quarto-dark{background-color:var(--gd-bg-primary);color:var(--gd-text-primary)}body.quarto-dark .quarto-body-content{background-color:var(--gd-bg-primary)}body.quarto-dark #quarto-content{background-color:var(--gd-bg-primary)}body.quarto-dark #quarto-document-content{background-color:var(--gd-bg-primary)}body.quarto-dark main.content{background-color:var(--gd-bg-primary)}body.quarto-dark .page-columns{background-color:var(--gd-bg-primary)}body.quarto-dark .page-rows-contents{background-color:var(--gd-bg-primary)}body.quarto-dark .column-body{background-color:var(--gd-bg-primary)}body.quarto-dark .column-page{background-color:var(--gd-bg-primary)}body.quarto-dark article{background-color:var(--gd-bg-primary)}body.quarto-dark section{background-color:var(--gd-bg-primary)}html.quarto-dark{background-color:var(--gd-bg-primary)}body.quarto-dark h1,body.quarto-dark .h1,body.quarto-dark h2,body.quarto-dark .h2,body.quarto-dark h3,body.quarto-dark .h3,body.quarto-dark h4,body.quarto-dark .h4,body.quarto-dark h5,body.quarto-dark .h5,body.quarto-dark h6,body.quarto-dark .h6{color:var(--gd-text-primary)}body.quarto-dark p,body.quarto-dark li,body.quarto-dark dd,body.quarto-dark dt{color:var(--gd-text-primary)}body.quarto-dark p a,body.quarto-dark li a{color:var(--gd-link-color)}body.quarto-dark p a:hover,body.quarto-dark li a:hover{color:#9dcaf0}body.quarto-dark .column-margin a:has(.bi),body.quarto-dark .column-margin a:has(.fa-brands),body.quarto-dark .column-margin a:has(.ror-sidebar-icon){color:#adb5bd}body.quarto-dark .column-margin a:has(.bi):hover,body.quarto-dark .column-margin a:has(.fa-brands):hover,body.quarto-dark .column-margin a:has(.ror-sidebar-icon):hover{color:#dee2e6}body.quarto-dark .table a,body.quarto-dark .doc-reference section.doc-group>dl a,.doc-reference body.quarto-dark section.doc-group>dl a{color:var(--gd-link-color)}body.quarto-dark code{color:var(--gd-code-color);background-color:var(--gd-code-bg)}body.quarto-dark pre{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color)}body.quarto-dark pre code{background-color:rgba(0,0,0,0);color:var(--gd-text-primary)}body.quarto-dark .sourceCode span,body.quarto-dark pre.sourceCode code span{color:var(--gd-text-primary)}body.quarto-dark pre.bash code,body.quarto-dark pre.sh code,body.quarto-dark pre.shell code,body.quarto-dark .sourceCode.bash code,body.quarto-dark .sourceCode.sh code,body.quarto-dark div.sourceCode[data-language=bash] code,body.quarto-dark div.sourceCode[data-language=sh] code{color:var(--gd-text-primary)}body.quarto-dark .sourceCode.bash span,body.quarto-dark .sourceCode.sh span,body.quarto-dark div.sourceCode[data-language=bash] span,body.quarto-dark div.sourceCode[data-language=sh] span{color:var(--gd-text-primary) !important}body.quarto-dark :not(pre)>code{color:#f0a0a0;background-color:var(--gd-code-bg)}body.quarto-dark code span.sig-class{color:var(--gd-syn-class) !important}body.quarto-dark code span.sig-name{color:var(--gd-syn-name) !important}body.quarto-dark code span.cn-none{color:var(--gd-syn-none) !important}body.quarto-dark code span.cn-bool{color:var(--gd-syn-bool) !important}body.quarto-dark #cb1 code span.op{color:var(--gd-syn-operator) !important}body.quarto-dark #cb1 code span.overload-spacer{display:block;height:.35em;user-select:none}body.quarto-dark .sourceCode span.kw,body.quarto-dark .highlight span.k{color:var(--gd-syn-keyword)}body.quarto-dark .sourceCode span.cf{color:var(--gd-syn-keyword)}body.quarto-dark .sourceCode span.op{color:var(--gd-syn-operator)}body.quarto-dark .sourceCode span.st,body.quarto-dark .highlight span.s,body.quarto-dark .highlight span.s1,body.quarto-dark .highlight span.s2{color:var(--gd-syn-string)}body.quarto-dark .sourceCode span.dv,body.quarto-dark .sourceCode span.fl,body.quarto-dark .sourceCode span.bn,body.quarto-dark .highlight span.mi,body.quarto-dark .highlight span.mf{color:var(--gd-syn-number)}body.quarto-dark .sourceCode span.co,body.quarto-dark .highlight span.c,body.quarto-dark .highlight span.c1,body.quarto-dark .highlight span.cm{color:var(--gd-syn-comment);font-style:italic}body.quarto-dark .sourceCode span.fu,body.quarto-dark .highlight span.nf{color:var(--gd-syn-function)}body.quarto-dark .sourceCode span.bu,body.quarto-dark .highlight span.nb{color:var(--gd-syn-builtin)}body.quarto-dark .sourceCode span.va,body.quarto-dark .sourceCode span.at,body.quarto-dark .highlight span.n{color:var(--gd-text-primary)}body.quarto-dark .sourceCode span.sc{color:var(--gd-syn-string)}body.quarto-dark .sourceCode span.ss{color:var(--gd-syn-string)}body.quarto-dark .sourceCode span.im{color:var(--gd-syn-keyword)}body.quarto-dark .sourceCode span.cn{color:var(--gd-syn-none)}body.quarto-dark .sourceCode span.dt{color:var(--gd-syn-class)}body.quarto-dark .sourceCode span.an{color:var(--gd-syn-comment)}body.quarto-dark .sourceCode span.pp{color:var(--gd-syn-keyword)}body.quarto-dark .sourceCode span.ex{color:var(--gd-syn-function)}body.quarto-dark .sourceCode span.do{color:var(--gd-syn-comment);font-style:italic}body.quarto-dark .sourceCode span.al{color:#f55;font-weight:bold}body.quarto-dark .sourceCode span.er{color:#f55}body.quarto-dark .sourceCode span.wa{color:#ffb86c}body.quarto-dark .sourceCode span.in{color:var(--gd-syn-comment)}body.quarto-dark dt code{color:var(--gd-text-primary);background-color:var(--gd-code-bg)}body.quarto-dark dt code span{color:var(--gd-text-primary)}body.quarto-dark .parameter-name{color:#82aaff}body.quarto-dark .parameter-name strong{color:#82aaff}body.quarto-dark .parameter-annotation{color:#c792ea}body.quarto-dark .parameter-annotation-sep{color:var(--gd-text-muted)}body.quarto-dark .parameter-default{color:#c3e88d}body.quarto-dark .parameter-default-sep{color:var(--gd-text-muted)}body.quarto-dark .doc-section dt{color:var(--gd-text-primary)}body.quarto-dark .doc-section dd{color:var(--gd-text-primary)}body.quarto-dark .doc-section-parameters dt code{color:var(--gd-text-primary)}body.quarto-dark .doc-section-warnings>h2,body.quarto-dark .doc-section-warnings>.h2{color:#fca5a5}body.quarto-dark .doc-section-warnings>p{background-color:rgba(220,38,38,.1);border-left-color:#ef4444;color:var(--gd-text-primary)}body.quarto-dark .cell-output.cell-output-stdout{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color);color:var(--gd-text-primary)}body.quarto-dark .cell-output.cell-output-stderr{background-color:rgba(255,85,85,.1);border-color:rgba(255,85,85,.3)}body.quarto-dark .blockquote,body.quarto-dark blockquote{background-color:var(--gd-blockquote-bg);border-left-color:var(--gd-accent-blue);color:var(--gd-text-secondary)}body.quarto-dark #quarto-sidebar{background-color:var(--gd-sidebar-bg);border-right-color:var(--gd-border-color)}body.quarto-dark .sidebar-menu-container{border-bottom-color:var(--gd-border-color)}body.quarto-dark #quarto-sidebar .sidebar-item-text{color:var(--gd-text-secondary)}body.quarto-dark #quarto-sidebar .sidebar-item-text:hover{color:var(--gd-text-primary)}body.quarto-dark #quarto-sidebar .sidebar-link[href]::before{background-color:hsla(0,0%,100%,.04);box-shadow:inset 0 0 0 1px hsla(0,0%,100%,.15)}body.quarto-dark #quarto-sidebar a.sidebar-item-text.sidebar-link.active{color:var(--gd-active-link)}body.quarto-dark a.sidebar-item-text.sidebar-link.text-start>span{color:#9e9e9e}body.quarto-dark .sidebar-tools-collapse{color:var(--gd-text-muted)}body.quarto-dark .navbar{background:var(--gd-navbar-bg) !important;border-bottom:1px solid var(--gd-border-color)}body.quarto-dark .navbar-title{color:var(--gd-navbar-text)}body.quarto-dark .version-badge{color:rgba(224,224,224,.75);background-color:hsla(0,0%,100%,.1)}body.quarto-dark #navbarCollapse>ul.navbar-nav.navbar-nav-scroll.me-auto>li>a{color:#e0e0e0}body.quarto-dark #navbarCollapse>ul.navbar-nav.navbar-nav-scroll.me-auto>li>a:hover{background-color:#f07000;color:#fff}body.quarto-dark .dark-mode-toggle{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.15);color:#e0e0e0}body.quarto-dark .dark-mode-toggle:hover{background:hsla(0,0%,100%,.12);border-color:hsla(0,0%,100%,.25)}body.quarto-dark #quarto-margin-sidebar{color:var(--gd-text-secondary)}body.quarto-dark #quarto-margin-sidebar nav a{color:var(--gd-text-muted)}body.quarto-dark #quarto-margin-sidebar nav a:hover{color:var(--gd-text-primary)}body.quarto-dark #quarto-margin-sidebar nav a.active{color:var(--gd-active-link)}body.quarto-dark #toc-title{color:var(--gd-text-primary)}body.quarto-dark .nav-footer{background-color:var(--gd-bg-secondary);border-top:1px solid var(--gd-border-color)}body.quarto-dark .nav-footer-left,body.quarto-dark .nav-footer-right,body.quarto-dark .nav-footer-center{color:var(--gd-footer-text)}body.quarto-dark .nav-footer a{color:var(--gd-link-color)}body.quarto-dark .table,body.quarto-dark .doc-reference section.doc-group>dl,.doc-reference body.quarto-dark section.doc-group>dl{color:var(--gd-text-primary);border-color:var(--gd-border-color)}body.quarto-dark .table th,body.quarto-dark .doc-reference section.doc-group>dl th,.doc-reference body.quarto-dark section.doc-group>dl th{background-color:var(--gd-bg-secondary);border-color:var(--gd-border-color)}body.quarto-dark .table td,body.quarto-dark .doc-reference section.doc-group>dl td,.doc-reference body.quarto-dark section.doc-group>dl td{border-color:var(--gd-border-color)}body.quarto-dark .table-striped>tbody>tr:nth-of-type(odd)>*{background-color:var(--gd-bg-tertiary)}body.quarto-dark .table-hover>tbody>tr:hover>*{background-color:hsla(0,0%,100%,.05)}body.quarto-dark .card{background-color:var(--gd-bg-secondary);border-color:var(--gd-border-color)}body.quarto-dark .card-header{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color)}body.quarto-dark .callout{background-color:var(--gd-bg-secondary);border-color:var(--gd-border-color);color:var(--gd-text-primary)}body.quarto-dark .callout .callout-header{background-color:var(--gd-bg-secondary) !important}body.quarto-dark .callout .callout-icon::before{filter:invert(1)}body.quarto-dark .callout .callout-title-container{color:var(--gd-text-primary)}body.quarto-dark .callout .callout-body p{color:var(--gd-text-primary)}body.quarto-dark .callout-note{border-left-color:#6ea8fe}body.quarto-dark .callout-warning{border-left-color:#ffb86c}body.quarto-dark .callout-important{border-left-color:#f55}body.quarto-dark .callout-tip{border-left-color:#50fa7b}body.quarto-dark input,body.quarto-dark textarea,body.quarto-dark select{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color);color:var(--gd-text-primary)}body.quarto-dark input:focus,body.quarto-dark textarea:focus,body.quarto-dark select:focus{border-color:#6ea8fe;box-shadow:0 0 0 .15rem rgba(110,168,254,.25)}body.quarto-dark input::placeholder{color:var(--gd-text-muted)}body.quarto-dark #quarto-search,html.quarto-dark #quarto-search,:root[data-bs-theme=dark] #quarto-search{background-color:rgba(0,0,0,0)}body.quarto-dark #quarto-search input,html.quarto-dark #quarto-search input,:root[data-bs-theme=dark] #quarto-search input{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color);color:var(--gd-text-primary) !important}body.quarto-dark #quarto-search .aa-SubmitButton,html.quarto-dark #quarto-search .aa-SubmitButton,:root[data-bs-theme=dark] #quarto-search .aa-SubmitButton{background-color:rgba(0,0,0,0);color:var(--gd-text-muted) !important}body.quarto-dark #quarto-search .aa-DetachedSearchButton{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.15);color:#e0e0e0}body.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,body.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,body.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-SearchIcon,html.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,html.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,html.quarto-dark #quarto-search .aa-DetachedSearchButton .aa-SearchIcon,:root[data-bs-theme=dark] #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon,:root[data-bs-theme=dark] #quarto-search .aa-DetachedSearchButton .aa-DetachedSearchButtonIcon svg,:root[data-bs-theme=dark] #quarto-search .aa-DetachedSearchButton .aa-SearchIcon{color:#e0e0e0 !important;fill:#e0e0e0 !important}body.quarto-dark #quarto-search .aa-DetachedSearchButton:hover{background:hsla(0,0%,100%,.12);border-color:hsla(0,0%,100%,.25)}body.quarto-dark #quarto-search .aa-DetachedSearchButton:focus{outline:none;box-shadow:0 0 0 2px hsla(0,0%,100%,.15)}body.quarto-dark .navbar .quarto-navbar-tools button,body.quarto-dark .navbar .quarto-navbar-tools .quarto-navigation-tool{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:hsla(0,0%,100%,.08);border:1px solid hsla(0,0%,100%,.15);border-radius:6px;color:#e0e0e0;cursor:pointer;transition:all .2s ease}body.quarto-dark .navbar .quarto-navbar-tools button:hover,body.quarto-dark .navbar .quarto-navbar-tools .quarto-navigation-tool:hover{background:hsla(0,0%,100%,.12);border-color:hsla(0,0%,100%,.25)}body.quarto-dark .navbar .nav-item.compact .nav-link,body.quarto-dark .navbar .gd-navbar-icon{display:flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;background:hsla(0,0%,100%,.08);border:1px solid hsla(0,0%,100%,.15);border-radius:6px;color:#e0e0e0;cursor:pointer;transition:all .2s ease}body.quarto-dark .navbar .nav-item.compact .nav-link:hover,body.quarto-dark .navbar .gd-navbar-icon:hover{background:hsla(0,0%,100%,.12);border-color:hsla(0,0%,100%,.25)}body.quarto-dark .navbar .navbar-toggler{border:none;--bs-navbar-toggler-focus-width: 0}body.quarto-dark .navbar .navbar-toggler:focus{box-shadow:none;outline:none}body.quarto-dark .navbar .navbar-toggler .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23e0e0e0' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}body.quarto-dark .aa-Panel{background-color:var(--gd-bg-secondary);border-color:var(--gd-border-color)}body.quarto-dark .aa-Item{color:var(--gd-text-primary)}body.quarto-dark .aa-Item:hover,body.quarto-dark .aa-Item[aria-selected=true]{background-color:var(--gd-bg-tertiary)}body.quarto-dark .search-result-title,body.quarto-dark p.search-result-title,body.quarto-dark .aa-Panel .search-result-title,body.quarto-dark #quarto-search-results .search-result-title,html.quarto-dark .search-result-title,html.quarto-dark p.search-result-title{color:var(--gd-text-primary) !important}body.quarto-dark .search-result-header,body.quarto-dark div.search-result-header,body.quarto-dark .aa-Panel .search-result-header,body.quarto-dark #quarto-search-results .search-result-header,html.quarto-dark .search-result-header,html.quarto-dark div.search-result-header{color:var(--gd-text-secondary) !important}body.quarto-dark .search-result-text{color:var(--gd-text-secondary)}body.quarto-dark .search-result-doc-title{color:var(--gd-text-primary)}body.quarto-dark .search-result-section{color:var(--gd-text-muted)}body.quarto-dark .aa-SourceHeader{color:var(--gd-text-muted);border-bottom-color:var(--gd-border-color)}body.quarto-dark .aa-SourceNoResults{color:var(--gd-text-muted)}body.quarto-dark .quarto-search-results{background-color:var(--gd-bg-secondary)}body.quarto-dark .search-result-link{color:var(--gd-link-color)}body.quarto-dark .search-result-link:hover{color:#9dcaf0}body.quarto-dark .aa-Autocomplete{background-color:rgba(0,0,0,0)}body.quarto-dark .aa-Form,html.quarto-dark .aa-Form,:root[data-bs-theme=dark] .aa-Form{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color)}body.quarto-dark .aa-Input,html.quarto-dark .aa-Input,:root[data-bs-theme=dark] .aa-Input{color:var(--gd-text-primary) !important;background-color:rgba(0,0,0,0)}body.quarto-dark .aa-InputWrapperPrefix,body.quarto-dark .aa-InputWrapperSuffix,html.quarto-dark .aa-InputWrapperPrefix,html.quarto-dark .aa-InputWrapperSuffix,:root[data-bs-theme=dark] .aa-InputWrapperPrefix,:root[data-bs-theme=dark] .aa-InputWrapperSuffix{color:var(--gd-text-muted)}body.quarto-dark .aa-SubmitButton,html.quarto-dark .aa-SubmitButton,:root[data-bs-theme=dark] .aa-SubmitButton,body.quarto-dark .aa-SubmitIcon,html.quarto-dark .aa-SubmitIcon,:root[data-bs-theme=dark] .aa-SubmitIcon,body.quarto-dark svg.aa-SubmitIcon,html.quarto-dark svg.aa-SubmitIcon,:root[data-bs-theme=dark] svg.aa-SubmitIcon{color:var(--gd-text-muted) !important;fill:var(--gd-text-muted) !important}body.quarto-dark .aa-ClearButton,html.quarto-dark .aa-ClearButton,:root[data-bs-theme=dark] .aa-ClearButton,body.quarto-dark .aa-ClearIcon,html.quarto-dark .aa-ClearIcon,:root[data-bs-theme=dark] .aa-ClearIcon,body.quarto-dark svg.aa-ClearIcon,html.quarto-dark svg.aa-ClearIcon,:root[data-bs-theme=dark] svg.aa-ClearIcon{color:var(--gd-text-muted) !important;fill:var(--gd-text-muted) !important}body.quarto-dark .aa-ClearButton:hover,html.quarto-dark .aa-ClearButton:hover,:root[data-bs-theme=dark] .aa-ClearButton:hover,body.quarto-dark .aa-ClearButton:hover svg.aa-ClearIcon,html.quarto-dark .aa-ClearButton:hover svg.aa-ClearIcon,:root[data-bs-theme=dark] .aa-ClearButton:hover svg.aa-ClearIcon{color:var(--gd-text-primary) !important;fill:var(--gd-text-primary) !important}body.quarto-dark .gh-widget-trigger{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.15);color:#e0e0e0}body.quarto-dark .gh-widget-trigger:hover{background:hsla(0,0%,100%,.12);border-color:hsla(0,0%,100%,.25)}body.quarto-dark .nav-item:has(#github-widget)>a:hover,body.quarto-dark .nav-item:has(#github-widget) .nav-link:hover{background:rgba(0,0,0,0) !important;background-color:rgba(0,0,0,0) !important;box-shadow:none !important}body.quarto-dark .gh-dropdown{background:var(--gd-bg-secondary);border-color:var(--gd-border-color);box-shadow:0 8px 24px rgba(0,0,0,.4)}body.quarto-dark .gh-dropdown-item{color:var(--gd-text-primary) !important}body.quarto-dark .gh-dropdown-item:hover{background:var(--gd-bg-tertiary)}body.quarto-dark .gh-dropdown-item svg{color:var(--gd-text-muted)}body.quarto-dark .gh-dropdown-divider{background:var(--gd-border-color)}body.quarto-dark .gh-badge{background:rgba(110,168,254,.2);color:#6ea8fe}body.quarto-dark .source-link{color:#7cb8e8 !important}body.quarto-dark .source-link:hover{color:#9dcaf0 !important}@media(max-width: 991.98px){body.quarto-dark .column-margin{background-color:var(--gd-bg-secondary);border-color:var(--gd-border-color)}body.quarto-dark .column-margin,body.quarto-dark .column-margin>*,body.quarto-dark .column-margin section,body.quarto-dark .column-margin p,body.quarto-dark .column-margin code{background-color:var(--gd-bg-secondary)}body.quarto-dark .column-margin h4,body.quarto-dark .column-margin .h4{color:var(--gd-text-secondary);border-bottom-color:var(--gd-border-color)}body.quarto-dark .quarto-secondary-nav{background-color:var(--gd-bg-secondary);border-bottom-color:var(--gd-border-color)}body.quarto-dark header.headroom--unpinned .quarto-secondary-nav{box-shadow:0 1px 4px rgba(0,0,0,.3)}}body.quarto-dark .gd-code-copy{color:var(--gd-text-muted)}body.quarto-dark .gd-code-copy:hover{background-color:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.15);color:var(--gd-text-primary)}body.quarto-dark .gd-code-copy.gd-code-copied{color:#75b798}body.quarto-dark .code-with-filename .code-with-filename-file{background-color:var(--gd-bg-tertiary);border-color:var(--gd-border-color)}body.quarto-dark .code-with-filename .code-with-filename-file pre{background-color:var(--gd-bg-tertiary);color:var(--gd-text-primary)}body.quarto-dark .code-with-filename .code-with-filename-file pre strong{color:var(--gd-text-primary)}body.quarto-dark .code-with-filename-file{background-color:var(--gd-bg-tertiary)}body.quarto-dark .code-with-filename-file pre{background-color:rgba(0,0,0,0);color:var(--gd-text-primary);margin:0}body.quarto-dark ::-webkit-scrollbar{width:10px;height:10px}body.quarto-dark ::-webkit-scrollbar-track{background:var(--gd-bg-secondary)}body.quarto-dark ::-webkit-scrollbar-thumb{background:var(--gd-border-color);border-radius:5px}body.quarto-dark ::-webkit-scrollbar-thumb:hover{background:#555}body,.navbar,#quarto-sidebar,.nav-footer,.card,pre,code,.table,.doc-reference section.doc-group>dl,input,textarea,.gh-dropdown,.dark-mode-toggle{transition:background-color .2s ease,border-color .2s ease,color .2s ease}.section-cards{display:grid;gap:1rem;margin-top:.5rem}.section-cards-2col{grid-template-columns:repeat(auto-fill, minmax(300px, 1fr))}.section-cards-1col{grid-template-columns:1fr}.section-cards-list{grid-template-columns:1fr}.section-card{display:block;padding:1.25rem 1.5rem;border:1px solid var(--bs-border-color, #dee2e6);border-radius:.5rem;color:inherit;text-decoration:none;transition:box-shadow .2s ease-out,border-color .2s ease-out,transform .2s ease-out}.section-card:hover{border-color:var(--bs-primary, #0d6efd);box-shadow:0 4px 12px rgba(0,0,0,.1);transform:translateY(-2px);color:inherit;text-decoration:none}.section-card-img{width:100%;border-radius:.375rem;margin-bottom:.75rem}.section-card-title{font-size:1.1rem;font-weight:600;margin-bottom:.35rem;color:var(--bs-primary, #0d6efd)}.section-card-desc{font-size:.9rem;color:var(--bs-secondary-color, #6c757d);line-height:1.45}body.quarto-dark .section-card{border-color:var(--bs-border-color, #495057)}body.quarto-dark .section-card:hover{box-shadow:0 4px 12px rgba(0,0,0,.3)}body.quarto-dark .section-card-title{color:#599cff !important}body.quarto-dark .section-card-desc{color:#9ca3af !important}body.quarto-dark .section-card:hover{border-color:#599cff}html:not(.theme-loaded) *,html:not(.theme-loaded) *::before,html:not(.theme-loaded) *::after{transition:none !important}@media(min-width: 992px){body[data-page=index] #quarto-document-content>section:not(.column-margin),body[data-page=index] #quarto-document-content>.gd-hero,body[data-page=index] #quarto-document-content>p,body[data-page=index] #quarto-document-content>.cell,body[data-page=index] #quarto-document-content>details{grid-column:page-start-inset/body-content-end !important}body[data-page=index] .column-margin{grid-column:body-end/page-end !important}body.gd-homepage.quarto-dark #quarto-content,body.gd-homepage.quarto-dark main.content,body.gd-homepage.quarto-dark #quarto-document-content,body.gd-homepage.quarto-dark .quarto-body-content,body.gd-homepage.quarto-dark .page-columns,body.gd-homepage.quarto-dark .page-rows-contents,body.gd-homepage.quarto-dark .column-body,body.gd-homepage.quarto-dark article,body.gd-homepage.quarto-dark section{background-color:rgba(0,0,0,0)}}.gd-homepage{overflow-x:clip}.gd-hero{text-align:center;padding:2.5rem 1rem 2rem;position:relative;overflow:visible}#gd-starfield{position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:0;transition:opacity .15s ease-out;mask-image:linear-gradient(to bottom, black 35%, transparent 85%);-webkit-mask-image:linear-gradient(to bottom, black 35%, transparent 85%)}.gd-hero #gd-starfield{pointer-events:auto}.gd-hero>*:not(#gd-starfield){position:relative;z-index:1}main.content.page-columns.page-full>*{grid-column:body-content-start/body-content-end}.gd-homepage main.page-columns>*:not(.column-margin){grid-column:page-start-inset/body-content-end}.gd-hero-logo{display:block;width:auto;max-width:80%;margin-left:auto;margin-right:auto;margin-bottom:1.25rem}.gd-hero-name{font-size:2.5rem;font-weight:600;margin-bottom:.3rem;line-height:1.15}.gd-hero-tagline{font-size:1.35rem;max-width:600px;margin:0 auto 1rem;color:var(--bs-secondary-color, #6c757d);line-height:1.3;text-wrap:balance}.gd-hero-badges{display:flex;justify-content:center;flex-wrap:wrap;gap:.35rem}.gd-hero-badges img{height:20px}.gd-hero .gd-only-dark{display:none !important}[data-bs-theme=dark] .gd-hero .gd-only-light{display:none !important}[data-bs-theme=dark] .gd-hero .gd-only-dark{display:block !important;margin-left:auto;margin-right:auto}html[data-bs-theme=dark] .navbar-logo.light-content{display:none !important}html[data-bs-theme=dark] .navbar-logo.dark-content{display:inline !important}.gd-hero+section.level1>h1:first-child,.gd-hero+section.level1>.h1:first-child,.gd-hero+section.level2>h2:first-child,.gd-hero+section.level2>.h2:first-child{margin-top:.5rem !important}.gd-cta-grid{display:grid;grid-template-columns:repeat(3, 1fr);gap:1.25rem;margin:1.5rem 0 2rem}.gd-cta-card{display:flex;flex-direction:column;align-items:flex-start;padding:1.5rem;border-radius:12px;border:1px solid rgba(0,0,0,.08);background:linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(248, 249, 250, 0.7));text-decoration:none !important;color:inherit !important;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease;position:relative;overflow:hidden}.gd-cta-card:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(0,0,0,.1);border-color:rgba(0,0,0,.15)}.gd-cta-card:hover .gd-cta-arrow{transform:translateX(4px);opacity:1}.gd-cta-icon{font-size:2rem;margin-bottom:.75rem;line-height:1}.gd-cta-title{font-size:1.15rem;font-weight:600;margin-bottom:.4rem;line-height:1.3}.gd-cta-desc{font-size:.9rem;line-height:1.5;color:#6c757d;flex-grow:1}.gd-cta-arrow{font-size:1.25rem;margin-top:.75rem;opacity:.4;transition:transform .2s ease,opacity .2s ease;font-weight:600}body.quarto-dark .gd-cta-card{border-color:hsla(0,0%,100%,.1);background:linear-gradient(135deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02))}body.quarto-dark .gd-cta-card:hover{border-color:hsla(0,0%,100%,.2);box-shadow:0 8px 24px rgba(0,0,0,.3)}body.quarto-dark .gd-cta-desc{color:#adb5bd}@media(max-width: 768px){.gd-cta-grid{grid-template-columns:1fr;gap:1rem}}.gd-feature-wall{margin:3rem 0 2rem;hyphens:auto;-webkit-hyphens:auto;overflow-wrap:break-word}.gd-fw-heading{text-align:center;font-weight:700;margin-bottom:1.5rem;letter-spacing:-0.01em}.gd-fw-large,.gd-fw-medium,.gd-fw-small{text-align:justify;text-justify:inter-word}.gd-fw-large{font-size:1.65rem;line-height:1.45;margin-bottom:.6rem;letter-spacing:-0.01em}.gd-fw-medium{font-size:1.15rem;line-height:1.55;margin-bottom:.5rem}.gd-fw-small{font-size:.88rem;line-height:1.65}.gd-feature-wall b{font-weight:650}@media(max-width: 768px){.gd-fw-large{font-size:1.35rem}.gd-fw-medium{font-size:1.05rem}.gd-fw-small{font-size:.82rem}}:root{--gd-palette-sky: #0077b6;--gd-palette-peach: #e07a3a;--gd-palette-prism: #6d28d9;--gd-palette-lilac: #a855f7;--gd-palette-slate: #64748b;--gd-palette-honey: #d97706;--gd-palette-dusk: #4338ca;--gd-palette-mint: #0d9488;--gd-palette-accent: var(--gd-accent, #6366f1)}html[data-bs-theme=dark]{--gd-palette-sky: #38bdf8;--gd-palette-peach: #fb923c;--gd-palette-prism: #a78bfa;--gd-palette-lilac: #c084fc;--gd-palette-slate: #94a3b8;--gd-palette-honey: #fbbf24;--gd-palette-dusk: #818cf8;--gd-palette-mint: #2dd4bf;--gd-palette-accent: var(--gd-accent, #818cf8)}.gd-hr{--gd-hr-color: var(--gd-accent, #6366f1);--gd-hr-thickness: 2px;--gd-hr-width: 100%;--gd-hr-spacing: 2rem;border:none;height:var(--gd-hr-thickness);width:var(--gd-hr-width);max-width:100%;margin:var(--gd-hr-spacing) auto;background:var(--gd-hr-color);opacity:.7;display:block}.gd-hr--dotted{background:none;border-top:var(--gd-hr-thickness) dotted var(--gd-hr-color);height:0}.gd-hr--dashed{background:none;border-top:var(--gd-hr-thickness) dashed var(--gd-hr-color);height:0}.gd-hr--double{background:none;border-top:calc(var(--gd-hr-thickness)*.5) double var(--gd-hr-color);height:0;border-top-width:calc(var(--gd-hr-thickness) + 2px)}.gd-hr--left{margin-left:0;margin-right:auto}.gd-hr--right{margin-left:auto;margin-right:0}.gd-hr--with-text{display:flex;align-items:center;gap:1rem;height:auto;background:none;border:none;width:var(--gd-hr-width);max-width:100%;margin:var(--gd-hr-spacing) auto;opacity:1}.gd-hr--with-text.gd-hr--left{margin-left:0;margin-right:auto}.gd-hr--with-text.gd-hr--right{margin-left:auto;margin-right:0}.gd-hr-line{flex:1;height:var(--gd-hr-thickness, 2px);background:var(--gd-hr-color);opacity:.7}.gd-hr-text{font-size:.9rem;font-weight:500;color:var(--gd-hr-color);white-space:nowrap;user-select:none;line-height:1}.gd-hr-text--sm{font-size:.75rem}.gd-hr-text--lg{font-size:1.2rem}.gd-hr--gradient-shimmer{background:linear-gradient(90deg, transparent, var(--gd-hr-color, var(--gd-accent, #6366f1)) 25%, var(--gd-accent-secondary, #a855f7) 50%, var(--gd-hr-color, var(--gd-accent, #6366f1)) 75%, transparent);background-size:200% 100%;animation:gd-hr-shimmer 4s ease-in-out infinite;border:none;height:var(--gd-hr-thickness)}@keyframes gd-hr-shimmer{0%{background-position:100% 0}50%{background-position:0% 0}100%{background-position:100% 0}}.gd-hr--gradient-static{background:linear-gradient(90deg, transparent, var(--gd-hr-color, var(--gd-accent, #6366f1)) 25%, var(--gd-accent-secondary, #a855f7) 50%, var(--gd-hr-color, var(--gd-accent, #6366f1)) 75%, transparent);border:none;height:var(--gd-hr-thickness)}.gd-hr--fade{background:linear-gradient(90deg, transparent, var(--gd-hr-color) 20%, var(--gd-hr-color) 80%, transparent);border:none;height:var(--gd-hr-thickness)}.gd-hr--fade-edges{background:radial-gradient(ellipse at center, var(--gd-hr-color) 0%, transparent 70%);border:none;height:var(--gd-hr-thickness)}.gd-hr--dots{background:none;border:none;height:auto;text-align:center;opacity:1}.gd-hr--dots::after{content:"Β· Β· Β·";font-size:1.5rem;letter-spacing:.3em;color:var(--gd-hr-color);opacity:.8}.gd-hr--diamond{background:none;border:none;height:auto;display:flex;align-items:center;gap:.75rem;opacity:1}.gd-hr--diamond::before,.gd-hr--diamond::after{content:"";flex:1;height:1px;background:var(--gd-hr-color);opacity:.5}.gd-hr--diamond::before{content:""}hr.gd-hr--diamond{display:flex}hr.gd-hr--diamond::before{content:"";flex:1;height:1px;background:linear-gradient(90deg, transparent, var(--gd-hr-color))}hr.gd-hr--diamond::after{content:"β—‡";flex:none;height:auto;background:none;font-size:1rem;color:var(--gd-hr-color);opacity:.8;padding:0 .5rem}.gd-hr--ornament{background:none;border:none;height:auto;display:flex;align-items:center;opacity:1}hr.gd-hr--ornament::before{content:"";flex:1;height:1px;background:linear-gradient(90deg, transparent, var(--gd-hr-color))}hr.gd-hr--ornament::after{content:"❧";flex:none;height:auto;background:none;font-size:1.2rem;color:var(--gd-hr-color);opacity:.7;padding:0 .75rem}.gd-hr--wave{background:repeating-linear-gradient(135deg, var(--gd-hr-color) 0px, var(--gd-hr-color) 2px, transparent 2px, transparent 6px);border:none;height:var(--gd-hr-thickness);opacity:.6}.gd-hr--double-line{background:none;border:none;height:calc(var(--gd-hr-thickness)*2 + 3px);position:relative;opacity:.7}.gd-hr--double-line::before,.gd-hr--double-line::after{content:"";position:absolute;left:0;right:0;height:var(--gd-hr-thickness);background:var(--gd-hr-color)}.gd-hr--double-line::before{top:0}.gd-hr--double-line::after{bottom:0}body.quarto-dark .gd-hr{opacity:.6}body.quarto-dark .gd-hr--with-text{opacity:1}body.quarto-dark .gd-hr-line{opacity:.5}body.quarto-dark .gd-hr-text{opacity:.85}body.quarto-dark .gd-hr--dots::after{opacity:.6}@media(prefers-reduced-motion: reduce){.gd-hr--gradient-shimmer{animation:none}}@media(max-width: 768px){.gd-hr{--gd-hr-spacing: 1.5rem}}.gd-fw-rule{border:none;height:2px;margin:3rem auto 2rem;max-width:30rem;background:linear-gradient(90deg, transparent, var(--gd-accent, #6366f1) 25%, var(--gd-accent-secondary, #a855f7) 50%, var(--gd-accent, #6366f1) 75%, transparent);background-size:200% 100%;animation:gd-rule-shimmer 4s ease-in-out infinite;opacity:.7}@keyframes gd-rule-shimmer{0%{background-position:100% 0}50%{background-position:0% 0}100%{background-position:100% 0}}.gd-fw-closing{text-align:center;padding:0 1.5rem 2.5rem;max-width:38rem;margin:0 auto;position:relative;z-index:1}.gd-fw-closing p{font-size:1.05rem;line-height:1.7;color:#6b7280;margin:0}body.quarto-dark .gd-fw-closing p{color:#9ca3af}.gd-fw-closing a{color:var(--gd-accent, #6366f1);text-decoration:none;font-weight:600;border-bottom:1px solid rgba(0,0,0,0);transition:border-color .2s ease}.gd-fw-closing a:hover{border-bottom-color:var(--gd-accent, #6366f1)}@media(max-width: 768px){.gd-fw-rule{max-width:80%;margin:2rem auto 1.5rem}.gd-fw-closing p{font-size:.95rem}}@media(max-width: 768px){.gd-hero{padding:1.5rem .75rem 1.25rem}.gd-hero-logo{max-height:140px !important}.gd-hero-name{font-size:2.25rem}.gd-hero-tagline{font-size:1.1rem}}.gd-copy-page{float:right;display:flex;gap:4px;margin-top:4px;margin-left:12px;position:relative;z-index:5}.gd-copy-page-btn{display:inline-flex;align-items:center;gap:5px;padding:3px 8px;border:1px solid #d0d7de;border-radius:6px;background:#f6f8fa;color:#57606a;font-size:12px;font-family:inherit;line-height:1.4;cursor:pointer;text-decoration:none;transition:background .15s,border-color .15s,color .15s;white-space:nowrap}.gd-copy-page-btn:hover{background:#eaeef2;border-color:#b8bfc6;color:#24292f;text-decoration:none}.gd-copy-page-btn:active{background:#d8dee4}.gd-copy-page-btn.gd-copy-success{border-color:#2da44e;color:#1a7f37;background:#dafbe1}a.gd-view-md-btn{color:#57606a}a.gd-view-md-btn:hover{color:#24292f}html[data-bs-theme=dark] .gd-copy-page-btn{background:#21262d;border-color:#30363d;color:#8b949e}html[data-bs-theme=dark] .gd-copy-page-btn:hover{background:#30363d;border-color:#484f58;color:#c9d1d9}html[data-bs-theme=dark] .gd-copy-page-btn:active{background:#3a424a}html[data-bs-theme=dark] .gd-copy-page-btn.gd-copy-success{border-color:#238636;color:#3fb950;background:#0d1117}html[data-bs-theme=dark] a.gd-view-md-btn{color:#8b949e}html[data-bs-theme=dark] a.gd-view-md-btn:hover{color:#c9d1d9}@media(max-width: 768px){.gd-copy-page{float:none;margin-left:0;margin-bottom:10px}.gd-copy-page-label{display:none}.gd-copy-page-btn{padding:4px 6px}}.gd-announcement-banner{font-family:var(--bs-body-font-family, system-ui, -apple-system, sans-serif);line-height:1.5;letter-spacing:.01em;text-wrap:balance}.gd-announcement-banner a{font-weight:600;text-decoration:underline;color:inherit}.gd-announcement-banner a:hover{opacity:.85;text-decoration:underline}html[data-bs-theme=dark] .gd-announcement-info{background:#1a5bb5 !important}html[data-bs-theme=dark] .gd-announcement-warning{background:#d4a800 !important}html[data-bs-theme=dark] .gd-announcement-success{background:#126b3d !important}html[data-bs-theme=dark] .gd-announcement-danger{background:#b02a37 !important}@keyframes gd-gradient-shift{0%{background-position:0% 50%}50%{background-position:100% 50%}100%{background-position:0% 50%}}.gd-gradient-sky,.gd-gradient-peach,.gd-gradient-prism,.gd-gradient-lilac,.gd-gradient-slate,.gd-gradient-honey,.gd-gradient-dusk,.gd-gradient-mint{background-size:400% 400% !important;animation:gd-gradient-shift 15s ease infinite;border-bottom-color:rgba(0,0,0,.08) !important}html[data-bs-theme=dark] .gd-gradient-sky,html[data-bs-theme=dark] .gd-gradient-peach,html[data-bs-theme=dark] .gd-gradient-prism,html[data-bs-theme=dark] .gd-gradient-lilac,html[data-bs-theme=dark] .gd-gradient-slate,html[data-bs-theme=dark] .gd-gradient-honey,html[data-bs-theme=dark] .gd-gradient-dusk,html[data-bs-theme=dark] .gd-gradient-mint{color:#fff !important;border-bottom-color:hsla(0,0%,100%,.15) !important}.gd-gradient-sky{background:linear-gradient(-45deg, #d0ecf9, #e0f4ff, #c5e8f7, #b8e0f5) !important}html[data-bs-theme=dark] .gd-gradient-sky{background:linear-gradient(-45deg, #023e8a, #0077b6, #005f73, #0096c7) !important}.gd-gradient-peach{background:linear-gradient(-45deg, #ffddc1, #ffe4cc, #fdd0d8, #fbc4d4) !important}html[data-bs-theme=dark] .gd-gradient-peach{background:linear-gradient(-45deg, #cc4a1a, #c7760f, #b84a5f, #a33560) !important}.gd-gradient-prism{background:linear-gradient(-45deg, #c4f0e0, #d0e8f5, #e4d4f4, #d8cef0) !important}html[data-bs-theme=dark] .gd-gradient-prism{background:linear-gradient(-45deg, #048a65, #0c6a8a, #52077d, #2a0978) !important}.gd-gradient-lilac{background:linear-gradient(-45deg, #e8d0f0, #f5d0e0, #f0d4f8, #eac8ee) !important}html[data-bs-theme=dark] .gd-gradient-lilac{background:linear-gradient(-45deg, #561e64, #8b1140, #a02db3, #6e1a7d) !important}.gd-gradient-slate{background:linear-gradient(-45deg, #e0e4e8, #eceff1, #dde2e6, #d5dadf) !important}html[data-bs-theme=dark] .gd-gradient-slate{background:linear-gradient(-45deg, #37474f, #455a64, #3e525e, #263238) !important}.gd-gradient-honey{background:linear-gradient(-45deg, #ffe0c2, #ffedcc, #ffe5b4, #ffd6a8) !important}html[data-bs-theme=dark] .gd-gradient-honey{background:linear-gradient(-45deg, #bf360c, #e65100, #ef6c00, #b71c1c) !important}.gd-gradient-dusk{background:linear-gradient(-45deg, #d8daf0, #dddff5, #d4d0ee, #dad4f2) !important}html[data-bs-theme=dark] .gd-gradient-dusk{background:linear-gradient(-45deg, #0d1244, #141b55, #1a0f52, #261560) !important}.gd-gradient-mint{background:linear-gradient(-45deg, #ccece8, #d5f0ec, #c4e8e4, #d0f2ee) !important}html[data-bs-theme=dark] .gd-gradient-mint{background:linear-gradient(-45deg, #00695c, #00796b, #004d40, #00897b) !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-]{border-bottom:1px solid hsla(0,0%,100%,.15) !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .nav-link,html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .navbar-brand .navbar-title{color:#fff !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .nav-link:hover{background-color:hsla(0,0%,100%,.2) !important;color:#fff !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .nav-item:has(#github-widget) .nav-link:hover{background-color:rgba(0,0,0,0) !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .nav-item.compact .nav-link,html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .gd-navbar-icon{background:hsla(0,0%,100%,.08) !important;border:1px solid hsla(0,0%,100%,.15);border-radius:6px;width:34px;height:34px;display:flex;align-items:center;justify-content:center;padding:0}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .nav-item.compact .nav-link:hover,html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .gd-navbar-icon:hover{background:hsla(0,0%,100%,.12) !important;border-color:hsla(0,0%,100%,.25)}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .nav-link.active{text-decoration-color:hsla(0,0%,100%,.75) !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .navbar-toggler{border:none !important;color:#e0e0e0 !important}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .navbar-toggler-icon{filter:none}html[data-bs-theme=dark] .navbar[class*=gd-gradient-] .bi{color:#fff !important}html[data-bs-theme=dark] .gd-announcement-banner[class*=gd-gradient-] a{color:#fff !important}html[data-bs-theme=dark] .gd-announcement-banner[class*=gd-gradient-] button{color:#fff !important}@keyframes gd-glow-drift-1{0%{transform:translateX(0%) scale(1);opacity:.6}25%{transform:translateX(5%) scale(1.08);opacity:.42}50%{transform:translateX(-3%) scale(1.02);opacity:.55}75%{transform:translateX(2%) scale(1.05);opacity:.38}100%{transform:translateX(0%) scale(1);opacity:.6}}@keyframes gd-glow-drift-2{0%{transform:translateX(0%) scale(1);opacity:.45}30%{transform:translateX(-6%) scale(1.1);opacity:.58}60%{transform:translateX(4%) scale(0.96);opacity:.35}100%{transform:translateX(0%) scale(1);opacity:.45}}@keyframes gd-glow-drift-3{0%{transform:translateX(0%) scale(1);opacity:.35}35%{transform:translateX(3%) scale(1.12);opacity:.52}70%{transform:translateX(-5%) scale(1.04);opacity:.28}100%{transform:translateX(0%) scale(1);opacity:.35}}.gd-content-glow{position:fixed;top:0;left:0;right:0;height:600px;pointer-events:none;z-index:0;mask-image:linear-gradient(to bottom, rgb(0, 0, 0) 0%, rgba(0, 0, 0, 0) 100%);-webkit-mask-image:linear-gradient(to bottom, rgb(0, 0, 0) 0%, rgba(0, 0, 0, 0) 100%)}.gd-glow-pulse{position:absolute;inset:0}.gd-glow-pulse-1{background:radial-gradient(ellipse 65% 55% at 28% 0%, var(--gd-glow-color), transparent);animation:gd-glow-drift-1 23s ease-in-out infinite;opacity:.6}.gd-glow-pulse-2{background:radial-gradient(ellipse 50% 45% at 62% 5%, var(--gd-glow-color), transparent);animation:gd-glow-drift-2 19s ease-in-out infinite;opacity:.45}.gd-glow-pulse-3{background:radial-gradient(ellipse 45% 50% at 85% 0%, var(--gd-glow-color), transparent);animation:gd-glow-drift-3 27s ease-in-out infinite;opacity:.35}.gd-content-glow-sky{--gd-glow-color: #c5e8f7}.gd-content-glow-peach{--gd-glow-color: #ffddc1}.gd-content-glow-prism{--gd-glow-color: #d0e8f5}.gd-content-glow-lilac{--gd-glow-color: #e8d0f0}.gd-content-glow-slate{--gd-glow-color: #dde2e6}.gd-content-glow-honey{--gd-glow-color: #ffe0c2}.gd-content-glow-dusk{--gd-glow-color: #d8daf0}.gd-content-glow-mint{--gd-glow-color: #ccece8}html[data-bs-theme=dark] .gd-content-glow-sky{--gd-glow-color: #023e8a}html[data-bs-theme=dark] .gd-content-glow-peach{--gd-glow-color: #cc4a1a}html[data-bs-theme=dark] .gd-content-glow-prism{--gd-glow-color: #0c6a8a}html[data-bs-theme=dark] .gd-content-glow-lilac{--gd-glow-color: #561e64}html[data-bs-theme=dark] .gd-content-glow-slate{--gd-glow-color: #37474f}html[data-bs-theme=dark] .gd-content-glow-honey{--gd-glow-color: #bf360c}html[data-bs-theme=dark] .gd-content-glow-dusk{--gd-glow-color: #141b55}html[data-bs-theme=dark] .gd-content-glow-mint{--gd-glow-color: #00695c}@media(min-width: 992px){header.headroom--unpinned{transform:translateY(0%) !important}}@media(max-width: 991.98px){.quarto-secondary-nav{position:relative;z-index:1;transition:transform 200ms linear,box-shadow 200ms linear}header.headroom--unpinned .quarto-secondary-nav{transform:translateY(100%);box-shadow:0 1px 4px rgba(0,0,0,.12)}}.gd-skills-install{border:1px solid rgb(191.7,197.1,202.5);border-radius:.5rem;margin-bottom:2rem;overflow:hidden;width:100%}.gd-skills-install-toggle{display:flex;align-items:center;gap:.5rem;width:100%;padding:.75rem 1.25rem;border:none;background:rgb(240.23,241.49,242.75);color:#2c3e50;font-weight:600;font-size:1rem;cursor:pointer;text-align:left;transition:background .15s ease}.gd-skills-install-toggle:hover{background:rgb(227.57,229.91,232.25)}.gd-skills-install-toggle[aria-expanded=true]{border-bottom:1px solid rgb(191.7,197.1,202.5)}.gd-skills-install-icon{display:inline-block;font-size:.65rem;transition:transform .25s ease;line-height:1}.gd-skills-install-toggle[aria-expanded=true] .gd-skills-install-icon{transform:rotate(90deg)}.gd-skills-install-body{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s ease;background:rgb(248.67,249.21,249.75)}.gd-skills-install-body>*{overflow:hidden;min-height:0}.gd-skills-install-body.gd-skills-install-open{grid-template-rows:1fr}.gd-skills-install-body .gd-skills-install-pad{padding:1rem 1.25rem .75rem}.gd-skills-install-body .sourceCode{margin:.35rem 0 .75rem}.gd-skills-install-body .gd-code-copy{opacity:1 !important}.gd-skills-install-body pre.sourceCode{padding:.5rem 2.5rem .5rem .75rem;font-size:.88rem}.gd-skills-install-body pre.sourceCode code{padding:0 !important}.gd-skills-install-body p{margin:.25rem 0;font-size:.92rem;line-height:1.55}.gd-skills-install-body p a{text-decoration:underline;cursor:pointer}.gd-skills-install-body strong{color:rgb(37.4,52.7,68)}html[data-bs-theme=dark] .gd-skills-install{border-color:#161f28}html[data-bs-theme=dark] .gd-skills-install-toggle{background:rgb(8.8,12.4,16);color:rgb(149.5,158.5,167.5)}html[data-bs-theme=dark] .gd-skills-install-toggle:hover{background:rgb(12.32,17.36,22.4)}html[data-bs-theme=dark] .gd-skills-install-toggle[aria-expanded=true]{border-bottom-color:#161f28}html[data-bs-theme=dark] .gd-skills-install-body{background:rgb(5.28,7.44,9.6)}html[data-bs-theme=dark] .gd-skills-install-body strong{color:rgb(128.4,139.2,150)}html[data-bs-theme=dark] .gd-skills-install-body .code-copy-outer-scaffold,html[data-bs-theme=dark] .gd-skills-install-body .sourceCode,html[data-bs-theme=dark] .gd-skills-install-body pre.sourceCode{background:rgba(0,0,0,0)}body.gd-skills-page .content.column-page{grid-column:page-start/page-end !important;max-width:100%}body.gd-license-page .content.column-page{grid-column:page-start/page-end !important;max-width:100%}body.gd-blog-index .content.column-page{grid-column:page-start/page-end !important;max-width:100%}.gd-skills-raw{background:#f8f9fa;color:#343a40;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.85rem;line-height:1.7;padding:1.25rem 1.5rem;border-radius:.5rem;border:1px solid #dee2e6;overflow-x:auto;white-space:pre-wrap;word-wrap:break-word;margin:0;max-width:100%}.gd-skills-raw .sourceCode{background:rgba(0,0,0,0) !important;border:none !important;margin:0;padding:0}.gd-skills-raw code{background:rgba(0,0,0,0);color:inherit;padding:0;font-size:inherit;white-space:pre-wrap}.gd-skills-raw pre{background:rgba(0,0,0,0) !important;border:none !important;margin:0;padding:0;color:inherit}html[data-bs-theme=dark] .gd-skills-raw{background:#212529;border-color:#7b8a8b;color:#ecf0f1}.gd-skills-tree{background:#f8f9fa;color:#7b8a8b;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.88rem;line-height:1.8;padding:1rem 1.25rem;border-radius:.5rem;border:1px solid #dee2e6;margin:0 0 1.5rem;white-space:pre;overflow-x:auto}.gd-skills-tree a{color:#2c3e50;text-decoration:none}.gd-skills-tree a:hover{text-decoration:underline}html[data-bs-theme=dark] .gd-skills-tree{background:#212529;border-color:#7b8a8b;color:#ced4da}html[data-bs-theme=dark] .gd-skills-tree a{color:rgb(128.4,139.2,150)}.gd-skills-section-heading{font-size:.8rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:#adb5bd;margin:0 0 .5rem;padding:0}html[data-bs-theme=dark] .gd-skills-section-heading{color:#ced4da}.gd-skills-file-heading{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.95rem;font-weight:600;color:#7b8a8b;margin:1.5rem 0 .35rem;padding:0}.gd-skills-file-heading:first-of-type{margin-top:0}html[data-bs-theme=dark] .gd-skills-file-heading{color:#dee2e6}.gd-skill-switcher-sentinel{height:0}.gd-skill-switcher{display:flex;align-items:center;gap:.35rem;padding:.5rem .75rem;margin:0 0 1.75rem;background:#f8f9fa;border:1px solid #dee2e6;border-radius:.5rem;overflow-x:auto;z-index:1019;transition:box-shadow .2s ease,border-radius .2s ease}.gd-skill-switcher--stuck{position:fixed;left:0;right:0;margin:0;border-radius:0;border-left:none;border-right:none;box-shadow:0 2px 8px rgba(0,0,0,.08);padding-left:max(.75rem,env(safe-area-inset-left));padding-right:max(.75rem,env(safe-area-inset-right));transition:top 200ms linear,box-shadow .2s ease,border-radius .2s ease}.gd-skill-pill{display:inline-flex;align-items:center;gap:.4rem;padding:.4rem 1rem;border:1px solid rgba(0,0,0,0);border-radius:999px;background:rgba(0,0,0,0);color:#6c757d;font-size:.88rem;font-weight:500;white-space:nowrap;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;line-height:1.4}.gd-skill-pill:hover{background:rgb(233.9,235.7,237.5);color:#2c3e50}.gd-skill-pill--active,.gd-skill-pill[aria-selected=true]{background:#fff;color:#2c3e50;border-color:rgb(160.05,168.15,176.25);font-weight:600;box-shadow:0 1px 3px rgba(0,0,0,.06)}.gd-skill-pill__icon{width:1em;height:1em;flex-shrink:0}.gd-skill-panel[hidden]{display:none !important}html[data-bs-theme=dark] .gd-skill-switcher{background:#212529;border-color:#7b8a8b}html[data-bs-theme=dark] .gd-skill-switcher--stuck{box-shadow:0 2px 8px rgba(0,0,0,.35)}html[data-bs-theme=dark] .gd-skill-pill{color:#ced4da}html[data-bs-theme=dark] .gd-skill-pill:hover{background:rgb(11,15.5,20);color:rgb(138.95,148.85,158.75)}html[data-bs-theme=dark] .gd-skill-pill--active,html[data-bs-theme=dark] .gd-skill-pill[aria-selected=true]{background:#343a40;color:rgb(138.95,148.85,158.75);border-color:rgb(24.2,34.1,44)}.gd-page-metadata{border-top:1px solid #dee2e6;padding-top:1rem;margin-top:2rem;margin-bottom:1rem;color:#6c757d;font-size:.875rem;line-height:1.5;display:flex;align-items:center;gap:1.25rem;flex-wrap:wrap}.gd-page-metadata .gd-metadata-dates{display:flex;align-items:center;gap:1rem}.gd-page-metadata .gd-metadata-item{display:flex;align-items:center;gap:.35rem}.gd-page-metadata .gd-icon{display:inline-flex;align-items:center;opacity:.65}.gd-page-metadata .gd-icon svg{vertical-align:middle}.gd-page-metadata .gd-metadata-separator{color:#ced4da;font-weight:300}.gd-page-metadata .gd-metadata-authors{display:flex;align-items:center;gap:.4rem}.gd-page-metadata .gd-author-link{display:inline-flex;text-decoration:none}.gd-page-metadata .gd-author-avatar{width:26px;height:26px;border-radius:50%;object-fit:cover;flex-shrink:0;border:2px solid #dee2e6;transition:border-color .15s ease}.gd-page-metadata .gd-author-avatar:hover{border-color:#2c3e50}.gd-page-metadata .gd-author-initials{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;background:#2c3e50;color:#fff;font-weight:600;font-size:.7rem;flex-shrink:0;border:2px solid rgba(0,0,0,0);transition:border-color .15s ease}.gd-page-metadata .gd-author-initials:hover{border-color:rgb(35.2,49.6,64)}html[data-bs-theme=dark] .gd-page-metadata{border-top-color:#7b8a8b;color:#ced4da}html[data-bs-theme=dark] .gd-page-metadata .gd-icon{opacity:.6}html[data-bs-theme=dark] .gd-page-metadata .gd-metadata-separator{color:#6c757d}html[data-bs-theme=dark] .gd-page-metadata .gd-author-avatar{border-color:#6c757d}html[data-bs-theme=dark] .gd-page-metadata .gd-author-avatar:hover{border-color:rgb(107.3,119.9,132.5)}html[data-bs-theme=dark] .gd-page-metadata .gd-author-initials{background:rgb(86.2,100.6,115)}html[data-bs-theme=dark] .gd-page-metadata .gd-author-initials:hover{border-color:rgb(128.4,139.2,150)}.tippy-box{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:.8125rem;line-height:1.4;border-radius:6px;font-weight:500;overflow:hidden}.tippy-box[data-theme~=gd-material]{background-color:#343a40;color:#fff;box-shadow:0 4px 14px -2px rgba(0,0,0,.2),0 2px 4px -1px rgba(0,0,0,.1)}.tippy-box[data-theme~=gd-material]::before{content:"";position:absolute;inset:0;background:linear-gradient(135deg, rgba(255, 255, 255, 0.12) 0%, rgba(255, 255, 255, 0) 50%);pointer-events:none;opacity:0;transition:opacity 150ms ease-in-out}.tippy-box[data-theme~=gd-material][data-state=visible]::before{opacity:1}.tippy-box[data-theme~=gd-material]>.tippy-arrow{color:#343a40}.tippy-box[data-theme~=gd-material]>.tippy-arrow::before{filter:drop-shadow(0 1px 2px rgba(0, 0, 0, 0.15))}.tippy-box[data-theme~=gd-material]>.tippy-content{padding:6px 10px;position:relative;z-index:1}.tippy-box[data-theme~=gd-material-dark]{background-color:#ecf0f1;color:#212529;box-shadow:0 4px 14px -2px rgba(0,0,0,.35),0 2px 4px -1px rgba(0,0,0,.2)}.tippy-box[data-theme~=gd-material-dark]::before{content:"";position:absolute;inset:0;background:linear-gradient(135deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 50%);pointer-events:none;opacity:0;transition:opacity 150ms ease-in-out}.tippy-box[data-theme~=gd-material-dark][data-state=visible]::before{opacity:1}.tippy-box[data-theme~=gd-material-dark]>.tippy-arrow{color:#ecf0f1}.tippy-box[data-theme~=gd-material-dark]>.tippy-arrow::before{filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.25))}.tippy-box[data-theme~=gd-material-dark]>.tippy-content{padding:6px 10px;position:relative;z-index:1}.tippy-box[data-animation=shift-away][data-state=hidden]{opacity:0}.tippy-box[data-animation=shift-away][data-state=hidden][data-placement^=top]{transform:translateY(6px)}.tippy-box[data-animation=shift-away][data-state=hidden][data-placement^=bottom]{transform:translateY(-6px)}.tippy-box[data-animation=shift-away][data-state=hidden][data-placement^=left]{transform:translateX(6px)}.tippy-box[data-animation=shift-away][data-state=hidden][data-placement^=right]{transform:translateX(-6px)}.gd-tooltip-mounted .tippy-box::before{animation:gd-tooltip-fill 200ms ease-out forwards}@keyframes gd-tooltip-fill{from{opacity:0;transform:scale(0.95)}to{opacity:1;transform:scale(1)}}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:-5px}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:-5px}.tippy-box[data-placement^=left]>.tippy-arrow{right:-5px}.tippy-box[data-placement^=right]>.tippy-arrow{left:-5px}.tippy-popper,[data-tippy-root]{z-index:9999 !important}.tippy-box[data-theme~=gd-material] a,.tippy-box[data-theme~=gd-material-dark] a{color:inherit;text-decoration:underline;text-underline-offset:2px}.tippy-box[data-theme~=gd-material] a:hover,.tippy-box[data-theme~=gd-material-dark] a:hover{opacity:.85}[data-tippy-content]{title:none}.cell:has(.mermaid-js),.cell:has(.mermaid){display:block}.cell-output-display:has(.mermaid-js),.cell-output-display:has(.mermaid){display:flex;justify-content:center;width:100%}.cell-output-display figure.figure:has(.mermaid-js),.cell-output-display figure.figure:has(.mermaid){display:flex;justify-content:center;margin:1.5rem auto;width:100%}.cell-output-display figure.figure>div:has(>.mermaid-js),.cell-output-display figure.figure>div:has(>svg.mermaid-js){display:flex;justify-content:center;width:100%}svg.mermaid-js{display:block;margin:0 auto}pre.mermaid{background:rgba(0,0,0,0);padding:.5rem;border-radius:6px;text-align:center}.cell-output-display:has(.mermaid-js),.cell-output-display:has(.mermaid){border:1px solid #dee2e6;border-radius:8px;padding:1rem;margin:.5rem 0}body.quarto-dark .cell-output-display:has(.mermaid-js),html.quarto-dark .cell-output-display:has(.mermaid-js){background:#f8f9fa;border-color:#dee2e6;border-radius:8px;padding:1rem;margin:.5rem 0}body.quarto-dark svg.mermaid-js p,html.quarto-dark svg.mermaid-js p,body.quarto-dark svg[id^=mermaid-] p,html.quarto-dark svg[id^=mermaid-] p{color:#333 !important}body.quarto-dark svg.mermaid-js span,html.quarto-dark svg.mermaid-js span,body.quarto-dark svg[id^=mermaid-] span,html.quarto-dark svg[id^=mermaid-] span{color:#333 !important}body.quarto-dark svg.mermaid-js div,html.quarto-dark svg.mermaid-js div,body.quarto-dark svg[id^=mermaid-] div,html.quarto-dark svg[id^=mermaid-] div{color:#333 !important}body.quarto-dark svg.mermaid-js .nodeLabel,html.quarto-dark svg.mermaid-js .nodeLabel,body.quarto-dark svg[id^=mermaid-] .nodeLabel,html.quarto-dark svg[id^=mermaid-] .nodeLabel{color:#333 !important}body.quarto-dark svg.mermaid-js .edgeLabel,html.quarto-dark svg.mermaid-js .edgeLabel,body.quarto-dark svg[id^=mermaid-] .edgeLabel,html.quarto-dark svg[id^=mermaid-] .edgeLabel{color:#333 !important}body.quarto-dark svg.mermaid-js foreignObject *,html.quarto-dark svg.mermaid-js foreignObject *,body.quarto-dark svg[id^=mermaid-] foreignObject *,html.quarto-dark svg[id^=mermaid-] foreignObject *{color:#333 !important}.mermaid-diagram{text-align:center;margin:1rem 0}.mermaid-diagram img{max-width:100%;height:auto}.light-mode-only{display:block !important}.dark-mode-only{display:none !important}body.quarto-dark .light-mode-only,html.quarto-dark .light-mode-only{display:none !important}body.quarto-dark .dark-mode-only,html.quarto-dark .dark-mode-only{display:block !important}.gd-table-responsive{position:relative;width:100%;margin-bottom:1rem}.gd-table-scroll{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.gd-table-scroll:focus{outline:2px solid #2c3e50;outline-offset:2px}.gd-table-scroll:focus:not(:focus-visible){outline:none}.gd-table-scroll>table{margin-bottom:0;width:max-content;min-width:100%}.gd-table-scroll-indicator{position:absolute;top:0;bottom:0;width:40px;display:flex;align-items:center;justify-content:center;pointer-events:none;opacity:0;transition:opacity .2s ease;z-index:2}.gd-table-scroll-indicator.visible{opacity:1;pointer-events:auto;cursor:pointer}.gd-table-scroll-left{left:0;background:linear-gradient(to right, rgba(255, 255, 255, 0.95) 0%, transparent 100%);padding-left:4px}.gd-table-scroll-right{right:0;background:linear-gradient(to left, rgba(255, 255, 255, 0.95) 0%, transparent 100%);padding-right:4px}.gd-scroll-arrow{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;background:rgba(0,0,0,.06);color:#6c757d;font-size:1.25rem;font-weight:300;line-height:1;transition:background .15s ease,color .15s ease}.gd-table-scroll-indicator:hover .gd-scroll-arrow{background:rgba(0,0,0,.12);color:#343a40}@media(max-width: 767.98px){.gd-table-scroll>table{font-size:.85em}}@media(max-width: 575.98px){.gd-table-scroll>table{font-size:.8em}}body.quarto-dark .gd-table-scroll-left,html[data-bs-theme=dark] .gd-table-scroll-left{background:linear-gradient(to right, rgba(26, 26, 26, 0.95) 0%, transparent 100%)}body.quarto-dark .gd-table-scroll-right,html[data-bs-theme=dark] .gd-table-scroll-right{background:linear-gradient(to left, rgba(26, 26, 26, 0.95) 0%, transparent 100%)}body.quarto-dark .gd-scroll-arrow,html[data-bs-theme=dark] .gd-scroll-arrow{background:hsla(0,0%,100%,.08);color:#ced4da}.gd-table-scroll-indicator:hover body.quarto-dark .gd-scroll-arrow,.gd-table-scroll-indicator:hover html[data-bs-theme=dark] .gd-scroll-arrow{background:hsla(0,0%,100%,.15);color:#ecf0f1}@media print{.gd-table-scroll{overflow:visible}.gd-table-scroll-indicator{display:none}}td>p:has(>svg.gd-icon){margin:0;line-height:inherit}.gd-keys{display:inline-block;font-family:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;font-size:.8em;font-weight:500;line-height:1;padding:.15em .45em;min-width:1.6em;text-align:center;white-space:nowrap;vertical-align:baseline;color:#1f2328;background:linear-gradient(180deg, #f6f8fa 0%, #eaeef2 100%);border:1px solid #d0d7de;border-bottom-width:2px;border-radius:5px;box-shadow:0 1px 0 rgba(27,31,36,.04),inset 0 1px 0 hsla(0,0%,100%,.25)}.gd-keys-sep{display:inline-block;margin:0 .15em;font-size:.85em;color:#656d76;vertical-align:baseline;user-select:none}.gd-keys-fn{font-size:.7em;font-weight:600;letter-spacing:.04em;padding:.25em .45em;text-transform:uppercase;position:relative;top:-1.1px}body.quarto-dark .gd-keys,html.quarto-dark .gd-keys,:root[data-bs-theme=dark] .gd-keys{color:#e6edf3;background:linear-gradient(180deg, #2d333b 0%, #22272e 100%);border-color:#444c56;box-shadow:0 1px 0 rgba(0,0,0,.3),inset 0 1px 0 hsla(0,0%,100%,.04)}body.quarto-dark .gd-keys-sep,html.quarto-dark .gd-keys-sep,:root[data-bs-theme=dark] .gd-keys-sep{color:#8b949e}.quarto-video{border:1px solid rgba(0,0,0,.15);border-radius:6px;overflow:hidden}body.quarto-dark .quarto-video,html[data-bs-theme=dark] .quarto-video{border-color:hsla(0,0%,100%,.15)}.gd-keyboard-overlay{position:fixed;inset:0;z-index:1090;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease}.gd-keyboard-overlay-visible{opacity:1;visibility:visible}.gd-keyboard-overlay-inner{width:90%;max-width:520px;max-height:80vh;overflow-y:auto;background:#fff;border-radius:.75rem;box-shadow:0 8px 32px rgba(0,0,0,.18);padding:1.5rem 2rem 2rem;transform:translateY(12px);transition:transform .2s ease}.gd-keyboard-overlay-visible .gd-keyboard-overlay-inner{transform:translateY(0)}.gd-keyboard-overlay-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem}.gd-keyboard-overlay-header h2,.gd-keyboard-overlay-header .h2{margin:0;font-size:1.15rem;font-weight:600;color:#212529}.gd-keyboard-overlay-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:none;border-radius:50%;background:rgba(0,0,0,0);color:#6c757d;cursor:pointer;transition:background-color .15s ease,color .15s ease}.gd-keyboard-overlay-close:hover{background:rgba(0,0,0,.06);color:#212529}.gd-keyboard-overlay-close:focus-visible{outline:2px solid #2c3e50;outline-offset:2px}.gd-keyboard-overlay-body{display:flex;flex-direction:column;gap:1.25rem}.gd-keyboard-group h3,.gd-keyboard-group .h3{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#868e96;margin:0 0 .5rem}.gd-keyboard-group dl{margin:0}.gd-keyboard-row{display:flex;align-items:center;justify-content:space-between;padding:.35rem 0;border-bottom:1px solid rgba(0,0,0,.05)}.gd-keyboard-row:last-child{border-bottom:none}.gd-keyboard-row dt{display:flex;align-items:center;gap:.35rem;font-weight:normal;margin:0}.gd-keyboard-row dd{margin:0;color:#495057;font-size:.9rem}.gd-keyboard-or{font-size:.75rem;color:#adb5bd}kbd{display:inline-flex;align-items:center;justify-content:center;min-width:1.6em;padding:.15em .45em;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1;color:#495057;background:#f8f9fa;border:1px solid #dee2e6;border-radius:.3rem;box-shadow:0 1px 0 rgba(0,0,0,.08)}[data-bs-theme=dark] .gd-keyboard-overlay{background:rgba(0,0,0,.6)}[data-bs-theme=dark] .gd-keyboard-overlay-inner{background:#2b3035;box-shadow:0 8px 32px rgba(0,0,0,.4)}[data-bs-theme=dark] .gd-keyboard-overlay-header h2,[data-bs-theme=dark] .gd-keyboard-overlay-header .h2{color:#f8f9fa}[data-bs-theme=dark] .gd-keyboard-overlay-close{color:#adb5bd}[data-bs-theme=dark] .gd-keyboard-overlay-close:hover{background:hsla(0,0%,100%,.08);color:#f8f9fa}[data-bs-theme=dark] .gd-keyboard-group h3,[data-bs-theme=dark] .gd-keyboard-group .h3{color:#868e96}[data-bs-theme=dark] .gd-keyboard-row{border-bottom-color:hsla(0,0%,100%,.06)}[data-bs-theme=dark] .gd-keyboard-row dd{color:#ced4da}[data-bs-theme=dark] kbd{color:#ced4da;background:#343a40;border-color:#495057;box-shadow:0 1px 0 rgba(0,0,0,.2)}@media(prefers-reduced-motion: reduce){.gd-keyboard-overlay,.gd-keyboard-overlay-inner{transition:none}}.gd-menu-overlay{position:fixed;inset:0;z-index:1090;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease}.gd-menu-overlay-visible{opacity:1;visibility:visible}.gd-menu-overlay-inner{width:90%;max-width:420px;max-height:80vh;overflow-y:auto;background:#fff;border-radius:.75rem;box-shadow:0 8px 32px rgba(0,0,0,.18);padding:1.25rem 1.5rem 1.5rem;transform:translateY(12px);transition:transform .2s ease}.gd-menu-overlay-visible .gd-menu-overlay-inner{transform:translateY(0)}.gd-menu-overlay-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.gd-menu-overlay-header h2,.gd-menu-overlay-header .h2{margin:0;font-size:1.05rem;font-weight:600;color:#212529}.gd-menu-overlay-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:none;border-radius:50%;background:rgba(0,0,0,0);color:#6c757d;cursor:pointer;transition:background-color .15s ease,color .15s ease}.gd-menu-overlay-close:hover{background:rgba(0,0,0,.06);color:#212529}.gd-menu-overlay-close:focus-visible{outline:2px solid #2c3e50;outline-offset:2px}.gd-menu-list{list-style:none;margin:0;padding:0}.gd-menu-section{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#868e96;padding:.65rem .75rem .25rem;cursor:default}.gd-menu-section:first-child{padding-top:0}.gd-menu-item{display:flex;align-items:center;padding:.45rem .75rem;border-radius:.4rem;color:#495057;font-size:.9rem;text-decoration:none;transition:background-color .12s ease,color .12s ease}.gd-menu-item:hover{background:rgba(0,0,0,.04);color:#212529;text-decoration:none}.gd-menu-item:focus-visible{outline:2px solid #2c3e50;outline-offset:-2px;background:rgba(0,0,0,.03)}.gd-menu-item-label{flex:1 1 auto;min-width:0}.gd-menu-item-label .gd-nav-icon{flex-shrink:0;width:15px;height:15px;margin-right:.4em;vertical-align:-0.15em;opacity:.7}.gd-menu-item-label .gd-sidebar-status-badge{margin-left:4px;vertical-align:middle}.gd-menu-item:hover .gd-nav-icon,.gd-menu-item-active .gd-nav-icon{opacity:1}.gd-menu-item>.gd-sidebar-upcoming{flex-shrink:0;margin-left:auto;padding-left:6px}.gd-menu-section .gd-nav-icon{width:14px;height:14px;margin-right:.35em;vertical-align:-0.1em;opacity:.6}.gd-menu-item-active{font-weight:600;color:#2c3e50;background:rgba(44,62,80,.06)}.gd-menu-item-focused{background:rgba(0,0,0,.06);color:#212529;outline:2px solid #2c3e50;outline-offset:-2px}[data-bs-theme=dark] .gd-menu-overlay{background:rgba(0,0,0,.6)}[data-bs-theme=dark] .gd-menu-overlay-inner{background:#2b3035;box-shadow:0 8px 32px rgba(0,0,0,.4)}[data-bs-theme=dark] .gd-menu-overlay-header h2,[data-bs-theme=dark] .gd-menu-overlay-header .h2{color:#f8f9fa}[data-bs-theme=dark] .gd-menu-overlay-close{color:#adb5bd}[data-bs-theme=dark] .gd-menu-overlay-close:hover{background:hsla(0,0%,100%,.08);color:#f8f9fa}[data-bs-theme=dark] .gd-menu-section{color:#868e96}[data-bs-theme=dark] .gd-menu-item{color:#ced4da}[data-bs-theme=dark] .gd-menu-item:hover{background:hsla(0,0%,100%,.06);color:#f8f9fa}[data-bs-theme=dark] .gd-menu-item-active{color:hsl(210,29.0322580645%,39.3137254902%);background:rgba(44,62,80,.12)}[data-bs-theme=dark] .gd-menu-item-focused{background:hsla(0,0%,100%,.08);color:#f8f9fa;outline:2px solid hsl(210,29.0322580645%,39.3137254902%);outline-offset:-2px}@media(prefers-reduced-motion: reduce){.gd-menu-overlay,.gd-menu-overlay-inner{transition:none}}body.gd-menu-open{overflow:hidden}@media(max-width: 991.98px){#quarto-sidebar{display:none !important}#quarto-sidebar-glass{display:none !important}.gd-menu-overlay{-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}body.gd-menu-open #quarto-header{z-index:1091}body.gd-menu-open #quarto-header>.navbar{position:relative;z-index:-1}.gd-menu-overlay-inner{width:calc(100% - 2rem);max-width:420px;max-height:calc(100vh - 5rem - 35px);margin-top:15px;margin-bottom:20px;display:flex;flex-direction:column}.gd-menu-overlay-body{flex:1 1 auto;overflow-y:auto;-webkit-overflow-scrolling:touch;margin:0 -1.5rem -1.5rem;padding:0 1.5rem 1.5rem}.gd-menu-overlay-header{flex-shrink:0}}.gd-menu-overlay .gd-menu-ref-switcher{display:flex;gap:.25rem;background:#f0f0f0;border-radius:6px;padding:.2rem;margin-bottom:.75rem}.gd-menu-overlay .gd-menu-ref-switcher-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:.35rem;padding:.45rem .5rem;border:none;border-radius:4px;background:rgba(0,0,0,0);color:#666;font-size:.85rem;font-weight:500;cursor:pointer;transition:all .15s ease}.gd-menu-overlay .gd-menu-ref-switcher-btn:hover{background:hsla(0,0%,100%,.5);color:#333}.gd-menu-overlay .gd-menu-ref-switcher-btn.active{background:#fff;color:#333;box-shadow:0 1px 3px rgba(0,0,0,.1)}.gd-menu-overlay .gd-menu-ref-filter{position:relative;margin-bottom:.5rem}.gd-menu-overlay .gd-menu-ref-filter-input{width:100%;padding:.4rem .75rem .4rem 2rem;font-size:16px;border:1px solid #e9e9e9;border-radius:6px;background-color:#fff;transition:border-color .15s ease,box-shadow .15s ease}.gd-menu-overlay .gd-menu-ref-filter-input:focus{outline:none;border-color:#86b7fe;box-shadow:0 0 0 .15rem rgba(13,110,253,.12)}.gd-menu-overlay .gd-menu-ref-filter-input::placeholder{color:#999}.gd-menu-overlay .gd-menu-ref-filter-icon{position:absolute;left:.6rem;top:50%;transform:translateY(-50%);color:#999;pointer-events:none;font-size:.8rem}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-switcher{background:#2a2a2a}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-switcher-btn{color:#999}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-switcher-btn:hover{background:hsla(0,0%,100%,.1);color:#ccc}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-switcher-btn.active{background:#3a3a3a;color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.3)}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-filter-input{background-color:#2a2a2a;border-color:#3d3d3d;color:#e0e0e0}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-filter-input:focus{border-color:#6ea8fe;box-shadow:0 0 0 .15rem rgba(13,110,253,.25)}[data-bs-theme=dark] .gd-menu-overlay .gd-menu-ref-filter-icon{color:#9e9e9e}.gd-ref-sidebar .gd-menu-overlay .gd-menu-item{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:.8rem}.gd-back-to-top{position:fixed;bottom:2rem;right:2rem;z-index:1040;display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border:1px solid rgba(0,0,0,.12);border-radius:50%;background:hsla(0,0%,100%,.92);color:#495057;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.12);opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease,bottom .25s ease,background-color .15s ease,color .15s ease,box-shadow .15s ease}.gd-back-to-top:hover{background:#fff;color:#212529;box-shadow:0 4px 12px rgba(0,0,0,.18)}.gd-back-to-top:focus-visible{outline:2px solid #2c3e50;outline-offset:2px}.gd-back-to-top svg{display:block}.gd-back-to-top-visible{opacity:1;visibility:visible}[data-bs-theme=dark] .gd-back-to-top{background:rgba(52,58,64,.92);color:#dee2e6;border-color:hsla(0,0%,100%,.12);box-shadow:0 2px 8px rgba(0,0,0,.3)}[data-bs-theme=dark] .gd-back-to-top:hover{background:#495057;color:#f8f9fa;box-shadow:0 4px 12px rgba(0,0,0,.4)}@media(prefers-reduced-motion: reduce){.gd-back-to-top{transition:none}}@media(max-width: 767.98px){.gd-back-to-top{bottom:1.25rem;right:1.25rem;width:36px;height:36px}}.gd-otp-btn{position:fixed;bottom:4.5rem;right:1.25rem;z-index:1040;display:none;align-items:center;justify-content:center;width:36px;height:36px;padding:0;border:1px solid rgba(0,0,0,.12);border-radius:50%;background:hsla(0,0%,100%,.92);color:#495057;cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.12);transition:opacity .25s ease,bottom .25s ease,background-color .15s ease,color .15s ease,box-shadow .15s ease}.gd-otp-btn:hover,.gd-otp-btn.gd-otp-btn-active{background:#fff;color:#212529;box-shadow:0 4px 12px rgba(0,0,0,.18)}.gd-otp-btn:focus-visible{outline:2px solid #2c3e50;outline-offset:2px}.gd-otp-btn svg{display:block}.gd-otp-backdrop{position:fixed;inset:0;z-index:1041;background:rgba(0,0,0,.25);opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease}.gd-otp-backdrop-visible{opacity:1;visibility:visible}.gd-otp-panel{position:fixed;bottom:6rem;right:1.25rem;z-index:1042;width:min(280px,100vw - 2.5rem);max-height:min(360px,60vh);overflow-y:auto;background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.16);opacity:0;visibility:hidden;transform:translateY(12px) scale(0.95);transform-origin:bottom right;transition:opacity .2s ease,visibility .2s ease,transform .2s ease;-webkit-overflow-scrolling:touch}.gd-otp-panel-visible{opacity:1;visibility:visible;transform:translateY(0) scale(1)}.gd-otp-panel-heading{padding:.75rem 1rem .375rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#6c757d;border-bottom:1px solid rgba(0,0,0,.06)}.gd-otp-panel-list{list-style:none;margin:0;padding:.375rem 0}.gd-otp-panel-list li{margin:0;padding:0}.gd-otp-panel-list li.gd-otp-nested{padding-left:.75rem}.gd-otp-panel-link{display:block;padding:.5rem 1rem;font-size:.85rem;line-height:1.35;color:#343a40;text-decoration:none;border-radius:0;transition:background-color .1s ease}.gd-otp-panel-link:hover{background:rgba(0,0,0,.04);color:#212529;text-decoration:none}.gd-otp-panel-link:active{background:rgba(0,0,0,.08)}[data-bs-theme=dark] .gd-otp-btn{background:rgba(52,58,64,.92);color:#dee2e6;border-color:hsla(0,0%,100%,.12);box-shadow:0 2px 8px rgba(0,0,0,.3)}[data-bs-theme=dark] .gd-otp-btn:hover,[data-bs-theme=dark] .gd-otp-btn.gd-otp-btn-active{background:#495057;color:#f8f9fa;box-shadow:0 4px 12px rgba(0,0,0,.4)}[data-bs-theme=dark] .gd-otp-backdrop{background:rgba(0,0,0,.45)}[data-bs-theme=dark] .gd-otp-panel{background:#2b3035;border-color:hsla(0,0%,100%,.1);box-shadow:0 8px 24px rgba(0,0,0,.35)}[data-bs-theme=dark] .gd-otp-panel-heading{color:#adb5bd;border-bottom-color:hsla(0,0%,100%,.08)}[data-bs-theme=dark] .gd-otp-panel-link{color:#dee2e6}[data-bs-theme=dark] .gd-otp-panel-link:hover{background:hsla(0,0%,100%,.06);color:#f8f9fa}[data-bs-theme=dark] .gd-otp-panel-link:active{background:hsla(0,0%,100%,.1)}@media(prefers-reduced-motion: reduce){.gd-otp-btn,.gd-otp-panel,.gd-otp-backdrop{transition:none}}.gd-license-features{border:1px solid rgb(191.7,197.1,202.5);border-radius:.5rem;margin-bottom:1.5rem;overflow:hidden;width:100%}.gd-license-features-toggle{display:flex;align-items:center;gap:.5rem;width:100%;padding:.75rem 1.25rem;border:none;background:rgb(240.23,241.49,242.75);color:#2c3e50;font-weight:600;font-size:1rem;cursor:pointer;text-align:left;transition:background .15s ease}.gd-license-features-toggle:hover{background:rgb(227.57,229.91,232.25)}.gd-license-features-toggle[aria-expanded=true]{border-bottom:1px solid rgb(191.7,197.1,202.5)}.gd-license-features-icon{display:inline-block;font-size:.65rem;transition:transform .25s ease;line-height:1}.gd-license-features-toggle[aria-expanded=true] .gd-license-features-icon{transform:rotate(90deg)}.gd-license-features-body{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s ease;background:rgb(248.67,249.21,249.75)}.gd-license-features-body>*{overflow:hidden;min-height:0}.gd-license-features-body.gd-license-features-open{grid-template-rows:1fr}.gd-license-features-body .gd-license-features-pad{padding:.6rem 1.25rem .6rem;display:flex;flex-direction:column;gap:.25rem}.license-feature-group h4,.license-feature-group .h4{font-size:.8rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.3rem;color:var(--bs-secondary-color, #6c757d)}.license-feature-group:first-child h4,.license-feature-group:first-child .h4{margin-top:0}.license-badges{display:flex;flex-wrap:wrap;gap:.375rem}.license-badge{display:inline-block;padding:.25rem .6rem;font-size:.8rem;font-weight:500;border-radius:1rem;line-height:1.4;white-space:nowrap}.license-badge-permission{background:rgba(25,135,84,.12);color:#146c43;border:1px solid rgba(25,135,84,.25)}.license-badge-condition{background:rgba(13,110,253,.12);color:#0a58ca;border:1px solid rgba(13,110,253,.25)}.license-badge-limitation{background:rgba(220,53,69,.12);color:#b02a37;border:1px solid rgba(220,53,69,.25)}.gd-spdx-badge{display:inline-block;padding:.05rem .35rem;padding-bottom:0;font-size:.72rem;font-weight:600;font-family:var(--bs-font-monospace);border-radius:.2rem;background:var(--bs-tertiary-bg, #f8f9fa);border:1px solid var(--bs-border-color, #dee2e6);color:var(--bs-body-color);text-decoration:none;cursor:default;vertical-align:middle;line-height:1.3;transition:background .15s,border-color .15s}.gd-spdx-badge:hover{background:var(--bs-secondary-bg, #e9ecef);border-color:var(--bs-secondary-color, #6c757d);text-decoration:none;color:var(--bs-body-color)}html[data-bs-theme=dark] .gd-license-features{border-color:#161f28}html[data-bs-theme=dark] .gd-license-features-toggle{background:rgb(8.8,12.4,16);color:rgb(149.5,158.5,167.5)}html[data-bs-theme=dark] .gd-license-features-toggle:hover{background:rgb(12.32,17.36,22.4)}html[data-bs-theme=dark] .gd-license-features-toggle[aria-expanded=true]{border-bottom-color:#161f28}html[data-bs-theme=dark] .gd-license-features-body{background:rgb(5.28,7.44,9.6)}html[data-bs-theme=dark] .license-badge-permission{background:rgba(25,135,84,.2);color:#75b798;border-color:rgba(25,135,84,.35)}html[data-bs-theme=dark] .license-badge-condition{background:rgba(13,110,253,.2);color:#6ea8fe;border-color:rgba(13,110,253,.35)}html[data-bs-theme=dark] .license-badge-limitation{background:rgba(220,53,69,.2);color:#ea868f;border-color:rgba(220,53,69,.35)}.gd-nav-icon{flex-shrink:0;margin-right:.4em;vertical-align:-0.15em;opacity:.7;transition:opacity .15s ease}.navbar .nav-link>.menu-text>.gd-nav-icon{width:16px;height:16px}.navbar .nav-link:hover>.menu-text>.gd-nav-icon{opacity:1}#quarto-sidebar .menu-text>.gd-nav-icon,#quarto-sidebar .sidebar-item-text>.gd-nav-icon{width:15px;height:15px}#quarto-sidebar .sidebar-item:hover .gd-nav-icon{opacity:1}#quarto-sidebar .sidebar-link.active>.menu-text>.gd-nav-icon,#quarto-sidebar a.sidebar-item-text.sidebar-link.active>.gd-nav-icon{opacity:1}#quarto-sidebar .sidebar-item-section>.sidebar-item-container .gd-nav-icon{width:16px;height:16px}.gd-page-tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.35rem;margin-bottom:.8rem}.gd-tag-pill{display:inline-flex;align-items:center;gap:.2rem;padding:.15rem .55rem;font-size:.75rem;font-weight:500;line-height:1.4;color:rgb(39.6,52,64.4);background-color:rgb(233.9,235.7,237.5);border:1px solid rgb(202.25,206.75,211.25);border-radius:1rem;text-decoration:none;transition:background-color .15s ease,border-color .15s ease;white-space:nowrap}.gd-tag-pill:hover,.gd-tag-pill:focus-visible{background-color:rgb(212.8,216.4,220);border-color:rgb(170.6,177.8,185);color:rgb(39.6,55.8,72);text-decoration:none}.gd-tag-pill .gd-tag-icon{display:inline-flex;align-items:center;margin-right:.15rem;opacity:.7}.gd-tag-heading{margin-top:1.5rem;margin-bottom:.35rem}.gd-tag-heading .gd-tag-pill{cursor:default;pointer-events:none}.gd-tag-indent-1{margin-left:2rem}.gd-tag-indent-2{margin-left:4rem}.gd-tag-pages{margin-bottom:.75rem}.gd-tag-page-link{padding:.15rem 0;padding-left:1.25rem}.gd-tag-page-link a{color:#212529;text-decoration:underline}.gd-tag-page-link a:hover{color:#2c3e50}.gd-tag-pill-segmented{padding:0;overflow:hidden;gap:0}.gd-tag-pill-segmented .gd-tag-pill-segment{display:inline-flex;align-items:center;padding:.15rem .55rem}.gd-tag-pill-segmented .gd-tag-pill-parent{background-color:rgb(233.9,235.7,237.5)}.gd-tag-pill-segmented .gd-tag-pill-segment:not(.gd-tag-pill-parent){background-color:rgb(244.45,245.35,246.25)}.gd-tag-pill-segmented .gd-tag-pill-sep{display:inline-block;width:1px;align-self:stretch;background-color:rgb(170.6,177.8,185)}.gd-tag-section{display:inline-block;font-size:.7rem;font-weight:500;color:#6c757d;background-color:#f8f9fa;padding:.05rem .4rem;border-radius:.25rem;margin-left:.4rem;vertical-align:middle}body.quarto-dark .gd-tag-pill{color:rgb(191.7,197.1,202.5);background-color:rgba(44,62,80,.15);border-color:rgba(44,62,80,.3)}body.quarto-dark .gd-tag-pill:hover,body.quarto-dark .gd-tag-pill:focus-visible{background-color:rgba(44,62,80,.25);border-color:rgba(44,62,80,.5);color:rgb(223.35,226.05,228.75)}body.quarto-dark .gd-tag-section{color:#ced4da;background-color:#343a40}body.quarto-dark .gd-tag-pill-sep{background-color:rgba(44,62,80,.4)}body.quarto-dark .gd-tag-pill-segmented .gd-tag-pill-parent{background-color:rgba(44,62,80,.15)}body.quarto-dark .gd-tag-pill-segmented .gd-tag-pill-segment:not(.gd-tag-pill-parent){background-color:rgba(44,62,80,.08)}body.quarto-dark .gd-tag-page-link a{color:#dee2e6}.gd-page-status{display:inline-flex;align-items:center;gap:.35rem;padding:.25rem .65rem;margin-top:.3rem;margin-bottom:.6rem;font-size:14px;font-weight:500;line-height:1.4;border-radius:.35rem;color:var(--gd-status-color, #6c757d);background-color:color-mix(in srgb, var(--gd-status-color, #6c757d) 8%, transparent);border:1px solid color-mix(in srgb, var(--gd-status-color, #6c757d) 25%, transparent)}.gd-page-status .gd-status-badge-icon{display:inline-flex;align-items:center;opacity:.85}.gd-page-status .gd-status-badge-icon svg{width:14px;height:14px}.gd-page-status .gd-status-badge-label{font-weight:600}.gd-page-status .gd-status-badge-desc{font-weight:400;opacity:.8}.gd-sidebar-status-badge{display:inline-flex;align-items:center;justify-content:center;margin-left:4px;padding:.05rem .35rem;font-size:.65rem;font-weight:600;line-height:1.3;border-radius:.75rem;color:var(--gd-status-color, #6c757d);background-color:color-mix(in srgb, var(--gd-status-color, #6c757d) 10%, transparent);white-space:nowrap;flex-shrink:0}.gd-sidebar-status-badge svg{width:11px;height:11px}#quarto-sidebar.sidebar-navigation .sidebar-item .sidebar-link{display:flex;align-items:center}body.quarto-dark .gd-page-status{background-color:color-mix(in srgb, var(--gd-status-color, #6c757d) 12%, transparent);border-color:color-mix(in srgb, var(--gd-status-color, #6c757d) 30%, transparent)}body.quarto-dark .gd-sidebar-status-badge{background-color:color-mix(in srgb, var(--gd-status-color, #6c757d) 15%, transparent)}.gd-upcoming-title{background:linear-gradient(90deg, #e63946, #eab308, #2a9d8f, #e63946);background-size:300% auto;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:rgba(0,0,0,0);animation:gd-upcoming-gradient 5s ease-in-out infinite}@keyframes gd-upcoming-gradient{0%{background-position:0% center}50%{background-position:100% center}100%{background-position:0% center}}.gd-upcoming-icon{display:inline-flex;align-items:center;margin-left:.4em;color:#e63946;-webkit-text-fill-color:#e63946;cursor:help;vertical-align:middle}h1.quarto-secondary-nav-title .gd-upcoming-icon svg,.quarto-secondary-nav-title.h1 .gd-upcoming-icon svg{width:16px;height:16px}.gd-sidebar-upcoming{display:inline-flex;align-items:center;margin-left:auto;cursor:help}.gd-color-swatch{margin:1.5rem 0;border-radius:12px}.gd-color-swatch--bordered{border:1px solid var(--bs-border-color)}.gd-color-swatch--circles{padding:1.25rem}.gd-color-swatch--rectangles{overflow:hidden;padding:0}.gd-cs-title{width:100%;font-weight:600;font-size:1rem;margin-bottom:.5rem;color:var(--bs-body-color)}.gd-cs-description{width:100%;font-size:.9375rem;color:var(--bs-secondary-color);margin-bottom:1rem;line-height:1.6}.gd-cs-swatches{display:grid;grid-template-columns:repeat(auto-fill, minmax(var(--gd-cs-size, 56px), 1fr));gap:1.25rem}.gd-swatch{display:flex;flex-direction:column;align-items:center;gap:.375rem;cursor:pointer;transition:transform .15s ease}.gd-swatch:hover{transform:translateY(-2px)}.gd-swatch:active{transform:translateY(0)}.gd-swatch:focus-visible{outline:2px solid var(--bs-primary);outline-offset:4px;border-radius:4px}.gd-swatch-color{width:var(--gd-cs-size, 56px);height:var(--gd-cs-size, 56px);border-radius:50%;position:relative;box-shadow:0 2px 8px rgba(0,0,0,.1);transition:box-shadow .15s ease}.gd-swatch-color:hover{box-shadow:0 4px 16px rgba(0,0,0,.15)}.gd-swatch-color[data-needs-ring=true]{box-shadow:inset 0 0 0 1px var(--gd-ring-color),0 2px 8px rgba(0,0,0,.1)}.gd-swatch-name{font-size:.8125rem;font-weight:500;color:var(--bs-body-color);text-align:center;overflow-wrap:break-word;word-break:break-word;line-height:1.3}.gd-swatch-hex{font-family:var(--bs-font-monospace);font-size:.6875rem;color:var(--bs-secondary-color);text-align:center}.gd-swatch-contrast{font-family:var(--bs-font-monospace);font-size:.625rem;color:var(--bs-secondary-color);text-align:center}.gd-swatch-rect{display:flex;align-items:center;padding:.875rem 1.25rem;cursor:pointer;transition:filter .15s ease;min-height:56px;position:relative}.gd-swatch-rect:hover{filter:brightness(0.95)}.gd-swatch-rect:not(:last-child){border-bottom:1px solid rgba(0,0,0,.06)}.gd-swatch-rect:focus-visible{outline:2px solid var(--bs-primary);outline-offset:-2px}.gd-swatch-rect-name{font-weight:600;flex:1}.gd-swatch-rect-hex{font-family:var(--bs-font-monospace);font-size:.875rem;margin-right:1.5rem}.gd-swatch-contrast-samples{display:flex;gap:.5rem}.gd-swatch-aa-sample{font-weight:700;font-size:.875rem;padding:.125rem .375rem;border-radius:4px}.gd-cs-pass{color:#16a34a}.gd-cs-fail{color:#dc2626}.gd-swatch-copy-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.35);border-radius:inherit;opacity:0;transition:opacity .3s ease;pointer-events:none}.gd-swatch-copy-overlay svg{color:#fff;width:24px;height:24px;filter:drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3))}.gd-cs-tooltip{display:flex;gap:.625rem;padding:.25rem;font-size:.8125rem;min-width:200px}.gd-cs-tooltip-swatch{width:32px;aspect-ratio:1;border-radius:6px;flex-shrink:0;margin-top:2px}.gd-cs-tooltip-name{font-weight:600;margin-bottom:.25rem}.gd-cs-tooltip-table{width:100%;border-collapse:collapse;font-size:.75rem}.gd-cs-tooltip-table td{padding:1px 0}.gd-cs-tooltip-table td:first-child{color:hsla(0,0%,100%,.55);padding-right:.75rem;white-space:nowrap}.gd-cs-tooltip-table code{font-size:.75rem;background:none;padding:0}.gd-cs-tooltip-sep{border-top:1px solid var(--bs-border-color-translucent);padding-top:4px !important}.gd-cs-tooltip-copy{background:none;border:none;cursor:pointer;padding:0 .25rem;font-size:.75rem;opacity:.6;transition:opacity .15s ease}.gd-cs-tooltip-copy:hover{opacity:1}html[data-bs-theme=dark] .gd-swatch-color{box-shadow:0 2px 8px rgba(0,0,0,.3)}html[data-bs-theme=dark] .gd-swatch-color:hover{box-shadow:0 4px 16px rgba(0,0,0,.4)}html[data-bs-theme=dark] .gd-swatch-color[data-needs-ring=true]{box-shadow:inset 0 0 0 1px var(--gd-ring-color),0 2px 8px rgba(0,0,0,.3)}html[data-bs-theme=dark] .gd-swatch-rect:not(:last-child){border-bottom-color:hsla(0,0%,100%,.08)}html[data-bs-theme=dark] .gd-swatch-rect:hover{filter:brightness(1.1)}html[data-bs-theme=dark] .gd-swatch-copy-overlay{background:hsla(0,0%,100%,.25)}html[data-bs-theme=dark] .gd-cs-pass{color:#4ade80}html[data-bs-theme=dark] .gd-cs-fail{color:#f87171}@media(prefers-reduced-motion: reduce){.gd-swatch:hover{transform:none}.gd-swatch-copy-overlay{transition:none}}@media(max-width: 575.98px){.gd-cs-swatches{gap:.75rem;grid-template-columns:repeat(auto-fill, minmax(44px, 1fr))}.gd-swatch-color{width:44px !important;height:44px !important}.gd-swatch-rect{flex-wrap:wrap;gap:.5rem}.gd-swatch-rect-hex{margin-right:0}}.gd-output-title-container{border:1px solid rgba(0,0,0,.1);border-radius:.375rem;margin-top:.5rem;margin-bottom:1rem;overflow:hidden}.gd-output-title-header{background:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.1);padding:.35rem .75rem;font-size:.8rem;font-weight:600;color:rgba(0,0,0,.55);letter-spacing:.02em}.gd-output-title-body{padding:.5rem .75rem}.gd-output-title-body .cell-output{margin:0;padding:0}.gd-output-title-body .cell-output pre{margin:0;border:none;background:rgba(0,0,0,0);padding:0}.gd-output-title-container:has(.gd-output-title-body .cell-output-display>div){border:none}.gd-output-title-container:has(.gd-output-title-body .cell-output-display>div) .gd-output-title-header{background:rgba(0,0,0,0);border-bottom:none;padding-left:0}.gd-output-title-container:has(.gd-output-title-body .cell-output-display>div) .gd-output-title-body{padding:0}body.quarto-dark .gd-output-title-container{border-color:hsla(0,0%,100%,.12)}body.quarto-dark .gd-output-title-header{background:hsla(0,0%,100%,.04);border-bottom-color:hsla(0,0%,100%,.12);color:hsla(0,0%,100%,.55)}.gd-details{border:1px solid rgb(191.7,197.1,202.5);border-radius:.5rem;margin-bottom:1rem;overflow:hidden;transition:height .3s ease}.gd-details>summary{list-style:none}.gd-details>summary::-webkit-details-marker{display:none}.gd-details>summary::marker{display:none}.gd-details-summary{display:flex;align-items:center;gap:.5rem;width:100%;padding:.75rem .75rem;background:rgb(240.23,241.49,242.75);color:#2c3e50;font-weight:600;font-size:1rem;cursor:pointer;user-select:none;transition:background .15s ease}.gd-details-summary:hover{background:rgb(227.57,229.91,232.25)}.gd-details[open] .gd-details-summary{border-bottom:1px solid rgb(191.7,197.1,202.5)}.gd-details-chevron{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:1rem;height:1rem;transition:transform .25s ease}.gd-details-chevron::before{content:"";display:block;width:.45rem;height:.45rem;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:rotate(-45deg);transition:transform .25s ease}.gd-details[open] .gd-details-chevron::before,.gd-details--open .gd-details-chevron::before{transform:rotate(45deg)}.gd-details-icon-wrap{display:inline-flex;align-items:center;flex-shrink:0;line-height:1}.gd-details-icon{width:1em;height:1em}.gd-details-title{flex:1 1 auto}.gd-details-body{padding:.75rem 1rem .75rem;background:rgb(248.67,249.21,249.75)}.gd-details-body>:last-child{margin-bottom:0}.gd-details-body .sourceCode{margin:.35rem 0 .75rem}.gd-details-body pre.sourceCode{padding:.5rem 2.5rem .5rem .75rem;font-size:.88rem}.gd-details-body pre.sourceCode code{padding:0 !important}.gd-details--animating{overflow:hidden;transition:height .3s ease}.gd-details--note{border-color:#3b82f6}.gd-details--note .gd-details-summary{background:rgb(235.4,242.5,254.1);color:rgb(47.2,104,196.8)}.gd-details--note .gd-details-summary:hover{background:rgb(221.68,233.75,253.47)}.gd-details--note .gd-details[open]>.gd-details-summary,.gd-details--note[open]>.gd-details-summary{border-bottom-color:rgb(196.2,217.5,252.3)}.gd-details--note .gd-details-body{background:rgb(247.16,250,254.64)}.gd-details--warning{border-color:#f59e0b}.gd-details--warning .gd-details-summary{background:rgb(254,245.3,230.6);color:rgb(171.5,110.6,7.7)}.gd-details--warning .gd-details-summary:hover{background:rgb(253.3,238.51,213.52)}.gd-details--warning[open]>.gd-details-summary{border-bottom-color:rgb(252,225.9,181.8)}.gd-details--warning .gd-details-body{background:rgb(254.6,251.12,245.24)}.gd-details--tip{border-color:#10b981}.gd-details--tip .gd-details-summary{background:rgb(231.1,248,242.4);color:rgb(12.8,148,103.2)}.gd-details--tip .gd-details-summary:hover{background:rgb(214.37,243.1,233.58)}.gd-details--tip[open]>.gd-details-summary{border-bottom-color:rgb(183.3,234,217.2)}.gd-details--tip .gd-details-body{background:rgb(245.44,252.2,249.96)}.gd-details--danger{border-color:#ef4444}.gd-details--danger .gd-details-summary{background:rgb(253.4,236.3,236.3);color:rgb(191.2,54.4,54.4)}.gd-details--danger .gd-details-summary:hover{background:rgb(252.28,223.21,223.21)}.gd-details--danger[open]>.gd-details-summary{border-bottom-color:rgb(250.2,198.9,198.9)}.gd-details--danger .gd-details-body{background:rgb(254.36,247.52,247.52)}.gd-details--gradient{border-color:color-mix(in srgb, var(--gd-accent, #6366f1) 40%, transparent)}.gd-details--gradient .gd-details-summary{background:linear-gradient(-45deg, color-mix(in srgb, var(--gd-accent, #6366f1) 15%, white), color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 12%, white), color-mix(in srgb, var(--gd-accent, #6366f1) 10%, white), color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 15%, white));background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite;color:color-mix(in srgb, var(--gd-accent, #6366f1) 85%, black)}.gd-details--gradient .gd-details-summary:hover{background:linear-gradient(-45deg, color-mix(in srgb, var(--gd-accent, #6366f1) 22%, white), color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 18%, white), color-mix(in srgb, var(--gd-accent, #6366f1) 15%, white), color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 22%, white));background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite}.gd-details--gradient[open]>.gd-details-summary{border-bottom-color:color-mix(in srgb, var(--gd-accent, #6366f1) 30%, transparent)}.gd-details--gradient .gd-details-body{background:linear-gradient(-45deg, color-mix(in srgb, var(--gd-accent, #6366f1) 4%, white), color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 3%, white), color-mix(in srgb, var(--gd-accent, #6366f1) 2%, white), color-mix(in srgb, var(--gd-accent-secondary, #a855f7) 4%, white));background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite}.gd-details--gradient-sky .gd-details-summary,.gd-details--gradient-sky .gd-details-body,.gd-details--gradient-peach .gd-details-summary,.gd-details--gradient-peach .gd-details-body,.gd-details--gradient-prism .gd-details-summary,.gd-details--gradient-prism .gd-details-body,.gd-details--gradient-lilac .gd-details-summary,.gd-details--gradient-lilac .gd-details-body,.gd-details--gradient-slate .gd-details-summary,.gd-details--gradient-slate .gd-details-body,.gd-details--gradient-honey .gd-details-summary,.gd-details--gradient-honey .gd-details-body,.gd-details--gradient-dusk .gd-details-summary,.gd-details--gradient-dusk .gd-details-body,.gd-details--gradient-mint .gd-details-summary,.gd-details--gradient-mint .gd-details-body{background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite}.gd-details--gradient-sky{border-color:#90cdf4}.gd-details--gradient-sky .gd-details-summary{background:linear-gradient(-45deg, #d0ecf9, #e0f4ff, #c5e8f7, #b8e0f5);color:#023e8a}.gd-details--gradient-sky .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-sky[open]>.gd-details-summary{border-bottom-color:#90cdf4}.gd-details--gradient-sky .gd-details-body{background:linear-gradient(-45deg, #edf7fd, #f2faff, #eaf6fc, #e7f4fb)}.gd-details--gradient-peach{border-color:#f9b89a}.gd-details--gradient-peach .gd-details-summary{background:linear-gradient(-45deg, #ffddc1, #ffe4cc, #fdd0d8, #fbc4d4);color:#7c2d12}.gd-details--gradient-peach .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-peach[open]>.gd-details-summary{border-bottom-color:#f9b89a}.gd-details--gradient-peach .gd-details-body{background:linear-gradient(-45deg, #fff4ec, #fff7f0, #fef0f2, #fdedf3)}.gd-details--gradient-prism{border-color:#a7d8c8}.gd-details--gradient-prism .gd-details-summary{background:linear-gradient(-45deg, #c4f0e0, #d0e8f5, #e4d4f4, #d8cef0);color:#1e3a5f}.gd-details--gradient-prism .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-prism[open]>.gd-details-summary{border-bottom-color:#a7d8c8}.gd-details--gradient-prism .gd-details-body{background:linear-gradient(-45deg, #ecfaf4, #eff5fb, #f5eefc, #f2eefa)}.gd-details--gradient-lilac{border-color:#d8a8e8}.gd-details--gradient-lilac .gd-details-summary{background:linear-gradient(-45deg, #e8d0f0, #f5d0e0, #f0d4f8, #eac8ee);color:#4a1462}.gd-details--gradient-lilac .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-lilac[open]>.gd-details-summary{border-bottom-color:#d8a8e8}.gd-details--gradient-lilac .gd-details-body{background:linear-gradient(-45deg, #f7eefc, #fdf0f5, #faeefb, #f8ecf9)}.gd-details--gradient-slate{border-color:#b0b8c1}.gd-details--gradient-slate .gd-details-summary{background:linear-gradient(-45deg, #e0e4e8, #eceff1, #dde2e6, #d5dadf);color:#263238}.gd-details--gradient-slate .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-slate[open]>.gd-details-summary{border-bottom-color:#b0b8c1}.gd-details--gradient-slate .gd-details-body{background:linear-gradient(-45deg, #f4f5f7, #f8f9fa, #f3f4f6, #f1f2f4)}.gd-details--gradient-honey{border-color:#f5c97a}.gd-details--gradient-honey .gd-details-summary{background:linear-gradient(-45deg, #ffe0c2, #ffedcc, #ffe5b4, #ffd6a8);color:#7c2d12}.gd-details--gradient-honey .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-honey[open]>.gd-details-summary{border-bottom-color:#f5c97a}.gd-details--gradient-honey .gd-details-body{background:linear-gradient(-45deg, #fff6ec, #fffaf0, #fff5e6, #fff2e0)}.gd-details--gradient-dusk{border-color:#b0b4d8}.gd-details--gradient-dusk .gd-details-summary{background:linear-gradient(-45deg, #d8daf0, #dddff5, #d4d0ee, #dad4f2);color:#1a1050}.gd-details--gradient-dusk .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-dusk[open]>.gd-details-summary{border-bottom-color:#b0b4d8}.gd-details--gradient-dusk .gd-details-body{background:linear-gradient(-45deg, #f0f1fa, #f2f3fc, #eeedf9, #f0eefb)}.gd-details--gradient-mint{border-color:#80cbc4}.gd-details--gradient-mint .gd-details-summary{background:linear-gradient(-45deg, #ccece8, #d5f0ec, #c4e8e4, #d0f2ee);color:#004d40}.gd-details--gradient-mint .gd-details-summary:hover{filter:brightness(0.96)}.gd-details--gradient-mint[open]>.gd-details-summary{border-bottom-color:#80cbc4}.gd-details--gradient-mint .gd-details-body{background:linear-gradient(-45deg, #ebf8f6, #eff9f8, #e9f7f5, #ecfaf8)}.gd-details .gd-details{margin:.5rem 0;border-radius:.375rem}.gd-details .gd-details .gd-details-summary{padding:.5rem 1rem;font-size:.92rem}.gd-details .gd-details .gd-details-body{padding:.75rem 1rem .5rem}html[data-bs-theme=dark] .gd-details{border-color:#161f28}html[data-bs-theme=dark] .gd-details-summary{background:rgb(8.8,12.4,16);color:rgb(149.5,158.5,167.5)}html[data-bs-theme=dark] .gd-details-summary:hover{background:rgb(12.32,17.36,22.4)}html[data-bs-theme=dark] .gd-details[open]>.gd-details-summary{border-bottom-color:#161f28}html[data-bs-theme=dark] .gd-details-body{background:rgb(5.28,7.44,9.6)}html[data-bs-theme=dark] .gd-details-body .code-copy-outer-scaffold,html[data-bs-theme=dark] .gd-details-body .sourceCode,html[data-bs-theme=dark] .gd-details-body pre.sourceCode{background:rgba(0,0,0,0)}html[data-bs-theme=dark] .gd-details--note{border-color:rgb(35.4,78,147.6)}html[data-bs-theme=dark] .gd-details--note .gd-details-summary{background:rgb(14.75,32.5,61.5);color:rgb(166.8,198.75,250.95)}html[data-bs-theme=dark] .gd-details--note .gd-details-summary:hover{background:rgb(20.65,45.5,86.1)}html[data-bs-theme=dark] .gd-details--note[open]>.gd-details-summary{border-bottom-color:rgb(35.4,78,147.6)}html[data-bs-theme=dark] .gd-details--note .gd-details-body{background:rgb(7.08,15.6,29.52)}html[data-bs-theme=dark] .gd-details--warning{border-color:rgb(122.5,79,5.5)}html[data-bs-theme=dark] .gd-details--warning .gd-details-summary{background:rgb(61.25,39.5,2.75);color:rgb(250.5,211.35,145.2)}html[data-bs-theme=dark] .gd-details--warning .gd-details-summary:hover{background:rgb(85.75,55.3,3.85)}html[data-bs-theme=dark] .gd-details--warning[open]>.gd-details-summary{border-bottom-color:rgb(122.5,79,5.5)}html[data-bs-theme=dark] .gd-details--warning .gd-details-body{background:rgb(29.4,18.96,1.32)}html[data-bs-theme=dark] .gd-details--tip{border-color:rgb(8,92.5,64.5)}html[data-bs-theme=dark] .gd-details--tip .gd-details-summary{background:rgb(4,46.25,32.25);color:rgb(147.45,223.5,198.3)}html[data-bs-theme=dark] .gd-details--tip .gd-details-summary:hover{background:rgb(5.6,64.75,45.15)}html[data-bs-theme=dark] .gd-details--tip[open]>.gd-details-summary{border-bottom-color:rgb(8,92.5,64.5)}html[data-bs-theme=dark] .gd-details--tip .gd-details-body{background:rgb(1.92,22.2,15.48)}html[data-bs-theme=dark] .gd-details--danger{border-color:rgb(119.5,34,34)}html[data-bs-theme=dark] .gd-details--danger .gd-details-summary{background:rgb(59.75,17,17);color:rgb(247.8,170.85,170.85)}html[data-bs-theme=dark] .gd-details--danger .gd-details-summary:hover{background:rgb(83.65,23.8,23.8)}html[data-bs-theme=dark] .gd-details--danger[open]>.gd-details-summary{border-bottom-color:rgb(119.5,34,34)}html[data-bs-theme=dark] .gd-details--danger .gd-details-body{background:rgb(28.68,8.16,8.16)}html[data-bs-theme=dark] .gd-details--gradient{border-color:color-mix(in srgb, var(--gd-accent, #818cf8) 35%, transparent)}html[data-bs-theme=dark] .gd-details--gradient .gd-details-summary{background:linear-gradient(-45deg, color-mix(in srgb, var(--gd-accent, #818cf8) 25%, black), color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 20%, black), color-mix(in srgb, var(--gd-accent, #818cf8) 18%, black), color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 25%, black));background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite;color:#fff}html[data-bs-theme=dark] .gd-details--gradient .gd-details-summary:hover{background:linear-gradient(-45deg, color-mix(in srgb, var(--gd-accent, #818cf8) 32%, black), color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 28%, black), color-mix(in srgb, var(--gd-accent, #818cf8) 25%, black), color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 32%, black));background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite}html[data-bs-theme=dark] .gd-details--gradient[open]>.gd-details-summary{border-bottom-color:color-mix(in srgb, var(--gd-accent, #818cf8) 25%, transparent)}html[data-bs-theme=dark] .gd-details--gradient .gd-details-body{background:linear-gradient(-45deg, color-mix(in srgb, var(--gd-accent, #818cf8) 8%, black), color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 6%, black), color-mix(in srgb, var(--gd-accent, #818cf8) 5%, black), color-mix(in srgb, var(--gd-accent-secondary, #c084fc) 8%, black));background-size:400% 400%;animation:gd-gradient-shift 15s ease infinite}html[data-bs-theme=dark] .gd-details--gradient-sky{border-color:#0077b6}html[data-bs-theme=dark] .gd-details--gradient-sky .gd-details-summary{background:linear-gradient(-45deg, #023e8a, #0077b6, #005f73, #0096c7);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-sky .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-sky[open]>.gd-details-summary{border-bottom-color:#005f73}html[data-bs-theme=dark] .gd-details--gradient-sky .gd-details-body{background:linear-gradient(-45deg, #021c3d, #012e4a, #012a38, #01374b)}html[data-bs-theme=dark] .gd-details--gradient-peach{border-color:#cc4a1a}html[data-bs-theme=dark] .gd-details--gradient-peach .gd-details-summary{background:linear-gradient(-45deg, #cc4a1a, #c7760f, #b84a5f, #a33560);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-peach .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-peach[open]>.gd-details-summary{border-bottom-color:#a33560}html[data-bs-theme=dark] .gd-details--gradient-peach .gd-details-body{background:linear-gradient(-45deg, #3d160a, #3b2405, #37161d, #31101d)}html[data-bs-theme=dark] .gd-details--gradient-prism{border-color:#048a65}html[data-bs-theme=dark] .gd-details--gradient-prism .gd-details-summary{background:linear-gradient(-45deg, #048a65, #0c6a8a, #52077d, #2a0978);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-prism .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-prism[open]>.gd-details-summary{border-bottom-color:#0c6a8a}html[data-bs-theme=dark] .gd-details--gradient-prism .gd-details-body{background:linear-gradient(-45deg, #02291e, #042029, #180225, #0d0224)}html[data-bs-theme=dark] .gd-details--gradient-lilac{border-color:#561e64}html[data-bs-theme=dark] .gd-details--gradient-lilac .gd-details-summary{background:linear-gradient(-45deg, #561e64, #8b1140, #a02db3, #6e1a7d);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-lilac .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-lilac[open]>.gd-details-summary{border-bottom-color:#8b1140}html[data-bs-theme=dark] .gd-details--gradient-lilac .gd-details-body{background:linear-gradient(-45deg, #1a091e, #290613, #300e35, #210826)}html[data-bs-theme=dark] .gd-details--gradient-slate{border-color:#455a64}html[data-bs-theme=dark] .gd-details--gradient-slate .gd-details-summary{background:linear-gradient(-45deg, #37474f, #455a64, #3e525e, #263238);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-slate .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-slate[open]>.gd-details-summary{border-bottom-color:#3e525e}html[data-bs-theme=dark] .gd-details--gradient-slate .gd-details-body{background:linear-gradient(-45deg, #111518, #15191e, #13181b, #0c0f11)}html[data-bs-theme=dark] .gd-details--gradient-honey{border-color:#bf360c}html[data-bs-theme=dark] .gd-details--gradient-honey .gd-details-summary{background:linear-gradient(-45deg, #bf360c, #e65100, #ef6c00, #b71c1c);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-honey .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-honey[open]>.gd-details-summary{border-bottom-color:#e65100}html[data-bs-theme=dark] .gd-details--gradient-honey .gd-details-body{background:linear-gradient(-45deg, #391004, #441800, #482000, #370808)}html[data-bs-theme=dark] .gd-details--gradient-dusk{border-color:#1a0f52}html[data-bs-theme=dark] .gd-details--gradient-dusk .gd-details-summary{background:linear-gradient(-45deg, #0d1244, #141b55, #1a0f52, #261560);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-dusk .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-dusk[open]>.gd-details-summary{border-bottom-color:#141b55}html[data-bs-theme=dark] .gd-details--gradient-dusk .gd-details-body{background:linear-gradient(-45deg, #040514, #060819, #080518, #0b061c)}html[data-bs-theme=dark] .gd-details--gradient-mint{border-color:#00695c}html[data-bs-theme=dark] .gd-details--gradient-mint .gd-details-summary{background:linear-gradient(-45deg, #00695c, #00796b, #004d40, #00897b);color:#fff}html[data-bs-theme=dark] .gd-details--gradient-mint .gd-details-summary:hover{filter:brightness(1.15)}html[data-bs-theme=dark] .gd-details--gradient-mint[open]>.gd-details-summary{border-bottom-color:#004d40}html[data-bs-theme=dark] .gd-details--gradient-mint .gd-details-body{background:linear-gradient(-45deg, #001f1b, #002420, #001713, #002924)}.gd-details--gleam{--gd-gleam-color: rgb(86.2, 100.6, 115);--gd-gleam-angle: 0deg;border:2px solid rgba(0,0,0,0);background:linear-gradient(var(--gd-gleam-bg, var(--bs-body-bg, #ffffff)), var(--gd-gleam-bg, var(--bs-body-bg, #ffffff))) padding-box,conic-gradient(from var(--gd-gleam-angle), var(--gd-gleam-color) 0%, var(--gd-gleam-color) 60%, white 75%, white 82%, var(--gd-gleam-color) 92%, var(--gd-gleam-color) 100%) border-box}.gd-details--gleam.gd-details--gradient-sky{--gd-gleam-color: #38bdf8}.gd-details--gleam.gd-details--gradient-peach{--gd-gleam-color: #fb923c}.gd-details--gleam.gd-details--gradient-prism{--gd-gleam-color: #a78bfa}.gd-details--gleam.gd-details--gradient-lilac{--gd-gleam-color: #c084fc}.gd-details--gleam.gd-details--gradient-slate{--gd-gleam-color: #94a3b8}.gd-details--gleam.gd-details--gradient-honey{--gd-gleam-color: #fbbf24}.gd-details--gleam.gd-details--gradient-dusk{--gd-gleam-color: #818cf8}.gd-details--gleam.gd-details--gradient-mint{--gd-gleam-color: #2dd4bf}.gd-details--gleam.gd-details--gradient{--gd-gleam-color: var(--gd-accent, #6366f1)}.gd-details--gleam.gd-details--note{--gd-gleam-color: #60a5fa}.gd-details--gleam.gd-details--warning{--gd-gleam-color: #fbbf24}.gd-details--gleam.gd-details--tip{--gd-gleam-color: #34d399}.gd-details--gleam.gd-details--danger{--gd-gleam-color: #f87171}html[data-bs-theme=dark] .gd-details--gleam{--gd-gleam-color: rgb(160.05, 168.15, 176.25);border-color:rgba(0,0,0,0);background:linear-gradient(var(--bs-body-bg, #212529), var(--bs-body-bg, #212529)) padding-box,conic-gradient(from var(--gd-gleam-angle), transparent 0%, transparent 60%, var(--gd-gleam-color) 75%, color-mix(in srgb, var(--gd-gleam-color) 60%, white) 80%, var(--gd-gleam-color) 85%, transparent 95%, transparent 100%) border-box}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-sky{--gd-gleam-color: #7dd3fc}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-peach{--gd-gleam-color: #fdba74}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-prism{--gd-gleam-color: #c4b5fd}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-lilac{--gd-gleam-color: #d8b4fe}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-slate{--gd-gleam-color: #cbd5e1}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-honey{--gd-gleam-color: #fde68a}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-dusk{--gd-gleam-color: #a5b4fc}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient-mint{--gd-gleam-color: #5eead4}html[data-bs-theme=dark] .gd-details--gleam.gd-details--gradient{--gd-gleam-color: var(--gd-accent, #818cf8)}html[data-bs-theme=dark] .gd-details--gleam.gd-details--note{--gd-gleam-color: #93c5fd}html[data-bs-theme=dark] .gd-details--gleam.gd-details--warning{--gd-gleam-color: #fde68a}html[data-bs-theme=dark] .gd-details--gleam.gd-details--tip{--gd-gleam-color: #6ee7b7}html[data-bs-theme=dark] .gd-details--gleam.gd-details--danger{--gd-gleam-color: #fca5a5}@media(prefers-reduced-motion: reduce){.gd-details{transition:none}.gd-details--animating{transition:none}.gd-details-chevron::before{transition:none}.gd-details-summary{transition:none}.gd-details--gradient .gd-details-summary,.gd-details--gradient .gd-details-body,.gd-details--gradient-sky .gd-details-summary,.gd-details--gradient-sky .gd-details-body,.gd-details--gradient-peach .gd-details-summary,.gd-details--gradient-peach .gd-details-body,.gd-details--gradient-prism .gd-details-summary,.gd-details--gradient-prism .gd-details-body,.gd-details--gradient-lilac .gd-details-summary,.gd-details--gradient-lilac .gd-details-body,.gd-details--gradient-slate .gd-details-summary,.gd-details--gradient-slate .gd-details-body,.gd-details--gradient-honey .gd-details-summary,.gd-details--gradient-honey .gd-details-body,.gd-details--gradient-dusk .gd-details-summary,.gd-details--gradient-dusk .gd-details-body,.gd-details--gradient-mint .gd-details-summary,.gd-details--gradient-mint .gd-details-body{animation:none}}:root{--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-card-cap-bg: rgba(52, 58, 64, 0.25);--quarto-scss-export-border-color: #dee2e6;--quarto-scss-export-text-muted: #6c757d;--quarto-scss-export-white: #fff;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-200: #ecf0f1;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-700: #7b8a8b;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-black: #000;--quarto-scss-export-blue: #2c3e50;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #e83e8c;--quarto-scss-export-red: #e74c3c;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #f39c12;--quarto-scss-export-green: #18bc9c;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #3498db;--quarto-scss-export-primary: #2c3e50;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #18bc9c;--quarto-scss-export-info: #3498db;--quarto-scss-export-warning: #f39c12;--quarto-scss-export-danger: #e74c3c;--quarto-scss-export-light: #ecf0f1;--quarto-scss-export-dark: #7b8a8b;--quarto-scss-export-link-color: #18bc9c;--quarto-scss-export-dropdown-link-color: #7b8a8b;--quarto-scss-export-dropdown-link-hover-color: #fff;--quarto-scss-export-dropdown-link-hover-bg: #2c3e50;--quarto-scss-export-nav-link-disabled-color: #6c757d;--quarto-scss-export-nav-tabs-border-color: #ecf0f1;--quarto-scss-export-pagination-color: #fff;--quarto-scss-export-pagination-bg: #18bc9c;--quarto-scss-export-pagination-border-color: transparent;--quarto-scss-export-pagination-hover-color: #fff;--quarto-scss-export-pagination-hover-bg: rgb(15.3396226415, 120.1603773585, 99.7075471698);--quarto-scss-export-pagination-hover-border-color: transparent;--quarto-scss-export-pagination-active-bg: rgb(15.3396226415, 120.1603773585, 99.7075471698);--quarto-scss-export-pagination-active-border-color: transparent;--quarto-scss-export-pagination-disabled-color: #ecf0f1;--quarto-scss-export-pagination-disabled-bg: rgb(58.5754716981, 229.9245283019, 196.4905660377);--quarto-scss-export-pagination-disabled-border-color: transparent;--quarto-scss-export-list-group-hover-bg: #ecf0f1;--quarto-scss-export-list-group-disabled-bg: #ecf0f1;--quarto-scss-export-btn-close-color: #fff;--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #18bc9c;--quarto-scss-export-toc-active-border: #18bc9c;--quarto-scss-export-toc-inactive-border: #ecf0f1;--quarto-scss-export-navbar-default: #2c3e50;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #2c3e50;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: rgb(253.53, 253.62, 253.7);--quarto-scss-export-body-contrast-bg: #fff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: rgb(204.36, 208.68, 213);--quarto-scss-export-navbar-hl: #fff;--quarto-scss-export-navbar-brand: rgb(204.36, 208.68, 213);--quarto-scss-export-navbar-brand-hl: #fff;--quarto-scss-export-navbar-toggler-border-color: rgba(204.36, 208.68, 213, 0);--quarto-scss-export-navbar-hover-color: rgba(255, 255, 255, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(204.36, 208.68, 213, 0.75);--quarto-scss-export-sidebar-fg: rgb(89.25, 89.25, 89.25);--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #fff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: rgb(117.3, 117.3, 117.3);--quarto-scss-export-popover-bg: #fff;--quarto-scss-export-input-bg: #fff;--quarto-scss-export-input-border-color: #dee2e6;--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: rgb(210.6, 211.4, 212.2);--quarto-scss-export-link-decoration: underline;--quarto-scss-export-table-border-color: #dee2e6;--quarto-scss-export-sidebar-glass-bg: rgba(102, 102, 102, 0.4);--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #fff;--quarto-scss-export-blue-100: rgb(212.8, 216.4, 220);--quarto-scss-export-blue-200: rgb(170.6, 177.8, 185);--quarto-scss-export-blue-300: rgb(128.4, 139.2, 150);--quarto-scss-export-blue-400: rgb(86.2, 100.6, 115);--quarto-scss-export-blue-500: #2c3e50;--quarto-scss-export-blue-600: rgb(35.2, 49.6, 64);--quarto-scss-export-blue-700: rgb(26.4, 37.2, 48);--quarto-scss-export-blue-800: rgb(17.6, 24.8, 32);--quarto-scss-export-blue-900: rgb(8.8, 12.4, 16);--quarto-scss-export-indigo-100: rgb(224.4, 207.2, 252.4);--quarto-scss-export-indigo-200: rgb(193.8, 159.4, 249.8);--quarto-scss-export-indigo-300: rgb(163.2, 111.6, 247.2);--quarto-scss-export-indigo-400: rgb(132.6, 63.8, 244.6);--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: rgb(81.6, 12.8, 193.6);--quarto-scss-export-indigo-700: rgb(61.2, 9.6, 145.2);--quarto-scss-export-indigo-800: rgb(40.8, 6.4, 96.8);--quarto-scss-export-indigo-900: rgb(20.4, 3.2, 48.4);--quarto-scss-export-purple-100: rgb(226.2, 217.2, 242.6);--quarto-scss-export-purple-200: rgb(197.4, 179.4, 230.2);--quarto-scss-export-purple-300: rgb(168.6, 141.6, 217.8);--quarto-scss-export-purple-400: rgb(139.8, 103.8, 205.4);--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: rgb(88.8, 52.8, 154.4);--quarto-scss-export-purple-700: rgb(66.6, 39.6, 115.8);--quarto-scss-export-purple-800: rgb(44.4, 26.4, 77.2);--quarto-scss-export-purple-900: rgb(22.2, 13.2, 38.6);--quarto-scss-export-pink-100: rgb(250.4, 216.4, 232);--quarto-scss-export-pink-200: rgb(245.8, 177.8, 209);--quarto-scss-export-pink-300: rgb(241.2, 139.2, 186);--quarto-scss-export-pink-400: rgb(236.6, 100.6, 163);--quarto-scss-export-pink-500: #e83e8c;--quarto-scss-export-pink-600: rgb(185.6, 49.6, 112);--quarto-scss-export-pink-700: rgb(139.2, 37.2, 84);--quarto-scss-export-pink-800: rgb(92.8, 24.8, 56);--quarto-scss-export-pink-900: rgb(46.4, 12.4, 28);--quarto-scss-export-red-100: rgb(250.2, 219.2, 216);--quarto-scss-export-red-200: rgb(245.4, 183.4, 177);--quarto-scss-export-red-300: rgb(240.6, 147.6, 138);--quarto-scss-export-red-400: rgb(235.8, 111.8, 99);--quarto-scss-export-red-500: #e74c3c;--quarto-scss-export-red-600: rgb(184.8, 60.8, 48);--quarto-scss-export-red-700: rgb(138.6, 45.6, 36);--quarto-scss-export-red-800: rgb(92.4, 30.4, 24);--quarto-scss-export-red-900: rgb(46.2, 15.2, 12);--quarto-scss-export-orange-100: rgb(254.6, 229.2, 208);--quarto-scss-export-orange-200: rgb(254.2, 203.4, 161);--quarto-scss-export-orange-300: rgb(253.8, 177.6, 114);--quarto-scss-export-orange-400: rgb(253.4, 151.8, 67);--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: rgb(202.4, 100.8, 16);--quarto-scss-export-orange-700: rgb(151.8, 75.6, 12);--quarto-scss-export-orange-800: rgb(101.2, 50.4, 8);--quarto-scss-export-orange-900: rgb(50.6, 25.2, 4);--quarto-scss-export-yellow-100: rgb(252.6, 235.2, 207.6);--quarto-scss-export-yellow-200: rgb(250.2, 215.4, 160.2);--quarto-scss-export-yellow-300: rgb(247.8, 195.6, 112.8);--quarto-scss-export-yellow-400: rgb(245.4, 175.8, 65.4);--quarto-scss-export-yellow-500: #f39c12;--quarto-scss-export-yellow-600: rgb(194.4, 124.8, 14.4);--quarto-scss-export-yellow-700: rgb(145.8, 93.6, 10.8);--quarto-scss-export-yellow-800: rgb(97.2, 62.4, 7.2);--quarto-scss-export-yellow-900: rgb(48.6, 31.2, 3.6);--quarto-scss-export-green-100: rgb(208.8, 241.6, 235.2);--quarto-scss-export-green-200: rgb(162.6, 228.2, 215.4);--quarto-scss-export-green-300: rgb(116.4, 214.8, 195.6);--quarto-scss-export-green-400: rgb(70.2, 201.4, 175.8);--quarto-scss-export-green-500: #18bc9c;--quarto-scss-export-green-600: rgb(19.2, 150.4, 124.8);--quarto-scss-export-green-700: rgb(14.4, 112.8, 93.6);--quarto-scss-export-green-800: rgb(9.6, 75.2, 62.4);--quarto-scss-export-green-900: rgb(4.8, 37.6, 31.2);--quarto-scss-export-teal-100: rgb(210.4, 244.2, 234.2);--quarto-scss-export-teal-200: rgb(165.8, 233.4, 213.4);--quarto-scss-export-teal-300: rgb(121.2, 222.6, 192.6);--quarto-scss-export-teal-400: rgb(76.6, 211.8, 171.8);--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: rgb(25.6, 160.8, 120.8);--quarto-scss-export-teal-700: rgb(19.2, 120.6, 90.6);--quarto-scss-export-teal-800: rgb(12.8, 80.4, 60.4);--quarto-scss-export-teal-900: rgb(6.4, 40.2, 30.2);--quarto-scss-export-cyan-100: rgb(214.4, 234.4, 247.8);--quarto-scss-export-cyan-200: rgb(173.8, 213.8, 240.6);--quarto-scss-export-cyan-300: rgb(133.2, 193.2, 233.4);--quarto-scss-export-cyan-400: rgb(92.6, 172.6, 226.2);--quarto-scss-export-cyan-500: #3498db;--quarto-scss-export-cyan-600: rgb(41.6, 121.6, 175.2);--quarto-scss-export-cyan-700: rgb(31.2, 91.2, 131.4);--quarto-scss-export-cyan-800: rgb(20.8, 60.8, 87.6);--quarto-scss-export-cyan-900: rgb(10.4, 30.4, 43.8);--quarto-scss-export-default: #6c757d;--quarto-scss-export-primary-text-emphasis: rgb(17.6, 24.8, 32);--quarto-scss-export-secondary-text-emphasis: rgb(43.2, 46.8, 50);--quarto-scss-export-success-text-emphasis: rgb(9.6, 75.2, 62.4);--quarto-scss-export-info-text-emphasis: rgb(20.8, 60.8, 87.6);--quarto-scss-export-warning-text-emphasis: rgb(97.2, 62.4, 7.2);--quarto-scss-export-danger-text-emphasis: rgb(92.4, 30.4, 24);--quarto-scss-export-light-text-emphasis: #7b8a8b;--quarto-scss-export-dark-text-emphasis: #7b8a8b;--quarto-scss-export-primary-bg-subtle: rgb(212.8, 216.4, 220);--quarto-scss-export-secondary-bg-subtle: rgb(225.6, 227.4, 229);--quarto-scss-export-success-bg-subtle: rgb(208.8, 241.6, 235.2);--quarto-scss-export-info-bg-subtle: rgb(214.4, 234.4, 247.8);--quarto-scss-export-warning-bg-subtle: rgb(252.6, 235.2, 207.6);--quarto-scss-export-danger-bg-subtle: rgb(250.2, 219.2, 216);--quarto-scss-export-light-bg-subtle: rgb(251.5, 252, 252.5);--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: rgb(170.6, 177.8, 185);--quarto-scss-export-secondary-border-subtle: rgb(196.2, 199.8, 203);--quarto-scss-export-success-border-subtle: rgb(162.6, 228.2, 215.4);--quarto-scss-export-info-border-subtle: rgb(173.8, 213.8, 240.6);--quarto-scss-export-warning-border-subtle: rgb(250.2, 215.4, 160.2);--quarto-scss-export-danger-border-subtle: rgb(245.4, 183.4, 177);--quarto-scss-export-light-border-subtle: #ecf0f1;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #fff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #ecf0f1;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: rgb(19.2, 150.4, 124.8);--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #2c3e50;--quarto-scss-export-component-active-color: #fff;--quarto-scss-export-focus-ring-color: rgba(44, 62, 80, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #ecf0f1;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: rgb(252.6, 235.2, 207.6);--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #fff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(44, 62, 80, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #18bc9c;--quarto-scss-export-btn-link-hover-color: rgb(19.2, 150.4, 124.8);--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #ecf0f1;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #fff;--quarto-scss-export-input-focus-border-color: rgb(149.5, 158.5, 167.5);--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #fff;--quarto-scss-export-form-check-input-focus-border: rgb(149.5, 158.5, 167.5);--quarto-scss-export-form-check-input-checked-color: #fff;--quarto-scss-export-form-check-input-checked-bg-color: #2c3e50;--quarto-scss-export-form-check-input-checked-border-color: #2c3e50;--quarto-scss-export-form-check-input-indeterminate-color: #fff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #2c3e50;--quarto-scss-export-form-check-input-indeterminate-border-color: #2c3e50;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: rgb(149.5, 158.5, 167.5);--quarto-scss-export-form-switch-checked-color: #fff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: #dee2e6;--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #fff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #ecf0f1;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: #dee2e6;--quarto-scss-export-form-select-focus-border-color: rgb(149.5, 158.5, 167.5);--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #2c3e50;--quarto-scss-export-form-range-thumb-active-bg: rgb(191.7, 197.1, 202.5);--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #ecf0f1;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #18bc9c;--quarto-scss-export-form-feedback-invalid-color: #e74c3c;--quarto-scss-export-form-feedback-icon-valid-color: #18bc9c;--quarto-scss-export-form-feedback-icon-invalid-color: #e74c3c;--quarto-scss-export-form-valid-color: #18bc9c;--quarto-scss-export-form-valid-border-color: #18bc9c;--quarto-scss-export-form-invalid-color: #e74c3c;--quarto-scss-export-form-invalid-border-color: #e74c3c;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #18bc9c;--quarto-scss-export-nav-link-hover-color: rgb(19.2, 150.4, 124.8);--quarto-scss-export-nav-tabs-link-hover-border-color: #ecf0f1 #ecf0f1 #ecf0f1;--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #fff;--quarto-scss-export-nav-pills-link-active-bg: #2c3e50;--quarto-scss-export-nav-pills-link-active-color: #fff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #fff;--quarto-scss-export-navbar-dark-contrast: #fff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #fff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-active-bg: #2c3e50;--quarto-scss-export-dropdown-link-active-color: #fff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #fff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #fff;--quarto-scss-export-dropdown-dark-link-active-bg: #2c3e50;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-focus-color: rgb(19.2, 150.4, 124.8);--quarto-scss-export-pagination-focus-bg: #ecf0f1;--quarto-scss-export-pagination-active-color: #fff;--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #fff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #fff;--quarto-scss-export-accordion-border-color: #dee2e6;--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #fff;--quarto-scss-export-accordion-button-active-bg: rgb(212.8, 216.4, 220);--quarto-scss-export-accordion-button-active-color: rgb(17.6, 24.8, 32);--quarto-scss-export-accordion-button-focus-border-color: rgb(149.5, 158.5, 167.5);--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: rgb(17.6, 24.8, 32);--quarto-scss-export-tooltip-color: #fff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #ecf0f1;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #fff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #fff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #fff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: #dee2e6;--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: #dee2e6;--quarto-scss-export-progress-bg: #ecf0f1;--quarto-scss-export-progress-bar-color: #fff;--quarto-scss-export-progress-bar-bg: #2c3e50;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #fff;--quarto-scss-export-list-group-border-color: #dee2e6;--quarto-scss-export-list-group-active-bg: #2c3e50;--quarto-scss-export-list-group-active-color: #fff;--quarto-scss-export-list-group-active-border-color: #2c3e50;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #ecf0f1;--quarto-scss-export-thumbnail-bg: #fff;--quarto-scss-export-thumbnail-border-color: #dee2e6;--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-carousel-control-color: #fff;--quarto-scss-export-carousel-indicator-active-bg: #fff;--quarto-scss-export-carousel-caption-color: #fff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #fff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #fff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #2c3e50;--quarto-scss-export-bslib-page-sidebar-title-color: #fff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-sidebar-color: rgb(89.25, 89.25, 89.25);--quarto-scss-export-sidebar-hover-color: rgba(12.72, 99.64, 82.68, 0.8);--quarto-scss-export-sidebar-disabled-color: rgba(89.25, 89.25, 89.25, 0.75);--quarto-scss-export-valuebox-bg-primary: rgba(39, 128, 227, 0.7);--quarto-scss-export-valuebox-bg-secondary: #6c757d;--quarto-scss-export-valuebox-bg-success: rgba(63, 182, 24, 0.7);--quarto-scss-export-valuebox-bg-info: rgba(153, 84, 187, 0.7);--quarto-scss-export-valuebox-bg-warning: rgba(255, 117, 24, 0.7);--quarto-scss-export-valuebox-bg-danger: rgba(255, 0, 57, 0.7);--quarto-scss-export-valuebox-bg-light: #ecf0f1;--quarto-scss-export-valuebox-bg-dark: #7b8a8b;--quarto-scss-export-mermaid-bg-color: #fff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: rgb(55.7432432432, 62.5, 69.2567567568);--quarto-scss-export-mermaid-fg-color--lightest: rgb(78.4864864865, 88, 97.5135135135);--quarto-scss-export-mermaid-label-bg-color: #fff;--quarto-scss-export-mermaid-label-fg-color: #2c3e50;--quarto-scss-export-mermaid-node-bg-color: rgba(44, 62, 80, 0.1);--quarto-scss-export-code-block-border-left-color: #dee2e6;--quarto-scss-export-callout-color-note: #2c3e50;--quarto-scss-export-callout-color-tip: #18bc9c;--quarto-scss-export-callout-color-important: #e74c3c;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #f39c12;--quarto-scss-export-label-class-color: rgb(90.4, 25.2, 209.6);--quarto-scss-export-label-method-color: rgb(42.08, 109.68, 156.16);--quarto-scss-export-label-function-color: rgb(120.16, 42.16, 83.2);--quarto-scss-export-label-exception-color: rgb(156.64, 61.04, 54.4);--quarto-scss-export-label-property-color: rgb(29.28, 141.04, 112.64);--quarto-scss-export-label-constant-color: rgb(211.2, 113.2, 32);--quarto-scss-export-label-typealias-color: rgb(203.2, 137.2, 30.4);--quarto-scss-export-label-cli-color: rgb(24.16, 132.72, 115.84);--quarto-scss-export-label-cli-group-color: rgb(24.16, 132.72, 115.84);--quarto-scss-export-label-mcp-tool-color: #e6194B;--quarto-scss-export-label-mcp-resource-color: #3cb44b;--quarto-scss-export-label-mcp-resource-template-color: #f032e6;--quarto-scss-export-label-mcp-prompt-color: #4363d8;--quarto-scss-export-label-mcp-color: rgb(79.84, 54.64, 139.52);--quarto-scss-export-signature-background-color: rgb(241.6288, 242.3344, 243.04);--quarto-scss-export-label-mcp-completions-color: #911eb4;--quarto-scss-export-label-mcp-instructions-color: #f58231} \ No newline at end of file diff --git a/docs/site_libs/bootstrap/bootstrap-icons.css b/docs/site_libs/bootstrap/bootstrap-icons.css new file mode 100644 index 0000000..82b40f5 --- /dev/null +++ b/docs/site_libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2106 @@ +/*! + * Bootstrap Icons v1.13.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2024 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?e34853135f9e39acf64315236852cd5a") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } +.bi-bluesky::before { content: "\f7f9"; } +.bi-tux::before { content: "\f904"; } +.bi-beaker-fill::before { content: "\f905"; } +.bi-beaker::before { content: "\f906"; } +.bi-flask-fill::before { content: "\f907"; } +.bi-flask-florence-fill::before { content: "\f908"; } +.bi-flask-florence::before { content: "\f909"; } +.bi-flask::before { content: "\f90a"; } +.bi-leaf-fill::before { content: "\f90b"; } +.bi-leaf::before { content: "\f90c"; } +.bi-measuring-cup-fill::before { content: "\f90d"; } +.bi-measuring-cup::before { content: "\f90e"; } +.bi-unlock2-fill::before { content: "\f90f"; } +.bi-unlock2::before { content: "\f910"; } +.bi-battery-low::before { content: "\f911"; } +.bi-anthropic::before { content: "\f912"; } +.bi-apple-music::before { content: "\f913"; } +.bi-claude::before { content: "\f914"; } +.bi-openai::before { content: "\f915"; } +.bi-perplexity::before { content: "\f916"; } +.bi-css::before { content: "\f917"; } +.bi-javascript::before { content: "\f918"; } +.bi-typescript::before { content: "\f919"; } +.bi-fork-knife::before { content: "\f91a"; } +.bi-globe-americas-fill::before { content: "\f91b"; } +.bi-globe-asia-australia-fill::before { content: "\f91c"; } +.bi-globe-central-south-asia-fill::before { content: "\f91d"; } +.bi-globe-europe-africa-fill::before { content: "\f91e"; } diff --git a/docs/site_libs/bootstrap/bootstrap-icons.woff b/docs/site_libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..a4fa4f024c2171080ebaf3112fccbf90cdb98479 GIT binary patch literal 180288 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 DSDONf literal 0 HcmV?d00001 diff --git a/docs/site_libs/bootstrap/bootstrap.min.js b/docs/site_libs/bootstrap/bootstrap.min.js new file mode 100644 index 0000000..e8f21f7 --- /dev/null +++ b/docs/site_libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/site_libs/clipboard/clipboard.min.js b/docs/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/docs/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT Β© Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/docs/site_libs/quarto-html/popper.min.js b/docs/site_libs/quarto-html/popper.min.js new file mode 100644 index 0000000..e3726d7 --- /dev/null +++ b/docs/site_libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/docs/site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css b/docs/site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css new file mode 100644 index 0000000..180f8c7 --- /dev/null +++ b/docs/site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css @@ -0,0 +1,236 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +/* syntax highlight based on Pandoc's rules */ +pre > code.sourceCode > span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +/* Normal */ +code span { + color: #003B4F; +} + +/* Alert */ +code span.al { + color: #AD0000; + font-style: inherit; +} + +/* Annotation */ +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +/* Attribute */ +code span.at { + color: #657422; + font-style: inherit; +} + +/* BaseN */ +code span.bn { + color: #AD0000; + font-style: inherit; +} + +/* BuiltIn */ +code span.bu { + font-style: inherit; +} + +/* ControlFlow */ +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +/* Char */ +code span.ch { + color: #20794D; + font-style: inherit; +} + +/* Constant */ +code span.cn { + color: #8f5902; + font-style: inherit; +} + +/* Comment */ +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +/* CommentVar */ +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +/* Documentation */ +code span.do { + color: #5E5E5E; + font-style: italic; +} + +/* DataType */ +code span.dt { + color: #AD0000; + font-style: inherit; +} + +/* DecVal */ +code span.dv { + color: #AD0000; + font-style: inherit; +} + +/* Error */ +code span.er { + color: #AD0000; + font-style: inherit; +} + +/* Extension */ +code span.ex { + font-style: inherit; +} + +/* Float */ +code span.fl { + color: #AD0000; + font-style: inherit; +} + +/* Function */ +code span.fu { + color: #4758AB; + font-style: inherit; +} + +/* Import */ +code span.im { + color: #00769E; + font-style: inherit; +} + +/* Information */ +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +/* Keyword */ +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +/* Operator */ +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +/* Other */ +code span.ot { + color: #003B4F; + font-style: inherit; +} + +/* Preprocessor */ +code span.pp { + color: #AD0000; + font-style: inherit; +} + +/* SpecialChar */ +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +/* SpecialString */ +code span.ss { + color: #20794D; + font-style: inherit; +} + +/* String */ +code span.st { + color: #20794D; + font-style: inherit; +} + +/* Variable */ +code span.va { + color: #111111; + font-style: inherit; +} + +/* VerbatimString */ +code span.vs { + color: #20794D; + font-style: inherit; +} + +/* Warning */ +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // dispatch for htmlwidgets + // they use slideenter event to trigger resize + function fireSlideEnter() { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // dispatch for shiny + // they use BS shown and hidden events to trigger rendering + function distpatchShinyEvents(previous, current) { + if (window.jQuery) { + if (previous) { + window.jQuery(previous).trigger("hidden"); + } + if (current) { + window.jQuery(current).trigger("shown"); + } + } + } + + // tabby.js listener: Trigger event for htmlwidget and shiny + document.addEventListener( + "tabby", + function (event) { + fireSlideEnter(); + distpatchShinyEvents(event.detail.previousTab, event.detail.tab); + }, + false + ); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + // Categories search with listing only use path without query + const currentPagePath = offsetAbsoluteUrl( + window.location.origin + window.location.pathname + ); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + const encodedItem = encodeURI(item); + if ( + encodedItem === currentPagePath || + encodedItem === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (const child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +tabsets.init(); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/docs/site_libs/quarto-html/tabsets/tabsets.js b/docs/site_libs/quarto-html/tabsets/tabsets.js new file mode 100644 index 0000000..51345d0 --- /dev/null +++ b/docs/site_libs/quarto-html/tabsets/tabsets.js @@ -0,0 +1,95 @@ +// grouped tabsets + +export function init() { + window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } + }); +} diff --git a/docs/site_libs/quarto-html/tippy.css b/docs/site_libs/quarto-html/tippy.css new file mode 100644 index 0000000..e6ae635 --- /dev/null +++ b/docs/site_libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/docs/site_libs/quarto-html/tippy.umd.min.js b/docs/site_libs/quarto-html/tippy.umd.min.js new file mode 100644 index 0000000..ca292be --- /dev/null +++ b/docs/site_libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/docs/site_libs/quarto-nav/headroom.min.js b/docs/site_libs/quarto-nav/headroom.min.js new file mode 100644 index 0000000..b08f1df --- /dev/null +++ b/docs/site_libs/quarto-nav/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=ls.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t){return t===Object(t)?t:{down:t,up:t}}function s(t,n){n=n||{},Object.assign(this,s.options,n),this.classes=Object.assign({},s.options.classes,n.classes),this.elem=t,this.tolerance=o(this.tolerance),this.offset=o(this.offset),this.initialised=!1,this.frozen=!1}return s.prototype={constructor:s,init:function(){return s.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},s.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},s.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),s}); diff --git a/docs/site_libs/quarto-nav/quarto-nav.js b/docs/site_libs/quarto-nav/quarto-nav.js new file mode 100644 index 0000000..38cc430 --- /dev/null +++ b/docs/site_libs/quarto-nav/quarto-nav.js @@ -0,0 +1,325 @@ +const headroomChanged = new CustomEvent("quarto-hrChanged", { + detail: {}, + bubbles: true, + cancelable: false, + composed: false, +}); + +const announceDismiss = () => { + const annEl = window.document.getElementById("quarto-announcement"); + if (annEl) { + annEl.remove(); + + const annId = annEl.getAttribute("data-announcement-id"); + window.localStorage.setItem(`quarto-announce-${annId}`, "true"); + } +}; + +const announceRegister = () => { + const annEl = window.document.getElementById("quarto-announcement"); + if (annEl) { + const annId = annEl.getAttribute("data-announcement-id"); + const isDismissed = + window.localStorage.getItem(`quarto-announce-${annId}`) || false; + if (isDismissed) { + announceDismiss(); + return; + } else { + annEl.classList.remove("hidden"); + } + + const actionEl = annEl.querySelector(".quarto-announcement-action"); + if (actionEl) { + actionEl.addEventListener("click", function (e) { + e.preventDefault(); + // Hide the bar immediately + announceDismiss(); + }); + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function () { + let init = false; + + announceRegister(); + + // Manage the back to top button, if one is present. + let lastScrollTop = window.pageYOffset || document.documentElement.scrollTop; + const scrollDownBuffer = 5; + const scrollUpBuffer = 35; + const btn = document.getElementById("quarto-back-to-top"); + const hideBackToTop = () => { + btn.style.display = "none"; + }; + const showBackToTop = () => { + btn.style.display = "inline-block"; + }; + if (btn) { + window.document.addEventListener( + "scroll", + function () { + const currentScrollTop = + window.pageYOffset || document.documentElement.scrollTop; + + // Shows and hides the button 'intelligently' as the user scrolls + if (currentScrollTop - scrollDownBuffer > lastScrollTop) { + hideBackToTop(); + lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; + } else if (currentScrollTop < lastScrollTop - scrollUpBuffer) { + showBackToTop(); + lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop; + } + + // Show the button at the bottom, hides it at the top + if (currentScrollTop <= 0) { + hideBackToTop(); + } else if ( + window.innerHeight + currentScrollTop >= + document.body.offsetHeight + ) { + showBackToTop(); + } + }, + false + ); + } + + function throttle(func, wait) { + var timeout; + return function () { + const context = this; + const args = arguments; + const later = function () { + clearTimeout(timeout); + timeout = null; + func.apply(context, args); + }; + + if (!timeout) { + timeout = setTimeout(later, wait); + } + }; + } + + function headerOffset() { + // Set an offset if there is are fixed top navbar + const headerEl = window.document.querySelector("header.fixed-top"); + if (headerEl) { + return headerEl.clientHeight; + } else { + return 0; + } + } + + function footerOffset() { + const footerEl = window.document.querySelector("footer.footer"); + if (footerEl) { + return footerEl.clientHeight; + } else { + return 0; + } + } + + function dashboardOffset() { + const dashboardNavEl = window.document.getElementById( + "quarto-dashboard-header" + ); + if (dashboardNavEl !== null) { + return dashboardNavEl.clientHeight; + } else { + return 0; + } + } + + function updateDocumentOffsetWithoutAnimation() { + updateDocumentOffset(false); + } + + function updateDocumentOffset(animated) { + // set body offset + const topOffset = headerOffset(); + const bodyOffset = topOffset + footerOffset() + dashboardOffset(); + const bodyEl = window.document.body; + bodyEl.setAttribute("data-bs-offset", topOffset); + bodyEl.style.paddingTop = topOffset + "px"; + + // deal with sidebar offsets + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + if (!animated) { + sidebar.classList.add("notransition"); + // Remove the no transition class after the animation has time to complete + setTimeout(function () { + sidebar.classList.remove("notransition"); + }, 201); + } + + if (window.Headroom && sidebar.classList.contains("sidebar-unpinned")) { + sidebar.style.top = "0"; + sidebar.style.maxHeight = "100vh"; + } else { + sidebar.style.top = topOffset + "px"; + sidebar.style.maxHeight = "calc(100vh - " + topOffset + "px)"; + } + }); + + // allow space for footer + const mainContainer = window.document.querySelector(".quarto-container"); + if (mainContainer) { + mainContainer.style.minHeight = "calc(100vh - " + bodyOffset + "px)"; + } + + // link offset + let linkStyle = window.document.querySelector("#quarto-target-style"); + if (!linkStyle) { + linkStyle = window.document.createElement("style"); + linkStyle.setAttribute("id", "quarto-target-style"); + window.document.head.appendChild(linkStyle); + } + while (linkStyle.firstChild) { + linkStyle.removeChild(linkStyle.firstChild); + } + if (topOffset > 0) { + linkStyle.appendChild( + window.document.createTextNode(` + section:target::before { + content: ""; + display: block; + height: ${topOffset}px; + margin: -${topOffset}px 0 0; + }`) + ); + } + if (init) { + window.dispatchEvent(headroomChanged); + } + init = true; + } + + // initialize headroom + var header = window.document.querySelector("#quarto-header"); + if (header && window.Headroom) { + const headroom = new window.Headroom(header, { + tolerance: 5, + onPin: function () { + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + sidebar.classList.remove("sidebar-unpinned"); + }); + updateDocumentOffset(); + }, + onUnpin: function () { + const sidebars = window.document.querySelectorAll( + ".sidebar, .headroom-target" + ); + sidebars.forEach((sidebar) => { + sidebar.classList.add("sidebar-unpinned"); + }); + updateDocumentOffset(); + }, + }); + headroom.init(); + + let frozen = false; + window.quartoToggleHeadroom = function () { + if (frozen) { + headroom.unfreeze(); + frozen = false; + } else { + headroom.freeze(); + frozen = true; + } + }; + } + + window.addEventListener( + "hashchange", + function (e) { + if ( + getComputedStyle(document.documentElement).scrollBehavior !== "smooth" + ) { + window.scrollTo(0, window.pageYOffset - headerOffset()); + } + }, + false + ); + + // Observe size changed for the header + const headerEl = window.document.querySelector("header.fixed-top"); + if (headerEl && window.ResizeObserver) { + const observer = new window.ResizeObserver(() => { + setTimeout(updateDocumentOffsetWithoutAnimation, 0); + }); + observer.observe(headerEl, { + attributes: true, + childList: true, + characterData: true, + }); + } else { + window.addEventListener( + "resize", + throttle(updateDocumentOffsetWithoutAnimation, 50) + ); + } + setTimeout(updateDocumentOffsetWithoutAnimation, 250); + + // fixup index.html links if we aren't on the filesystem + if (window.location.protocol !== "file:") { + const links = window.document.querySelectorAll("a"); + for (let i = 0; i < links.length; i++) { + if (links[i].href) { + links[i].dataset.originalHref = links[i].href; + links[i].href = links[i].href.replace(/\/index\.html/, "/"); + } + } + + // Fixup any sharing links that require urls + // Append url to any sharing urls + const sharingLinks = window.document.querySelectorAll( + "a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item" + ); + for (let i = 0; i < sharingLinks.length; i++) { + const sharingLink = sharingLinks[i]; + const href = sharingLink.getAttribute("href"); + if (href) { + sharingLink.setAttribute( + "href", + href.replace("|url|", window.location.href) + ); + } + } + + // Scroll the active navigation item into view, if necessary + const navSidebar = window.document.querySelector("nav#quarto-sidebar"); + if (navSidebar) { + // Find the active item + const activeItem = navSidebar.querySelector("li.sidebar-item a.active"); + if (activeItem) { + // Wait for the scroll height and height to resolve by observing size changes on the + // nav element that is scrollable + const resizeObserver = new ResizeObserver((_entries) => { + // The bottom of the element + const elBottom = activeItem.offsetTop; + const viewBottom = navSidebar.scrollTop + navSidebar.clientHeight; + + // The element height and scroll height are the same, then we are still loading + if (viewBottom !== navSidebar.scrollHeight) { + // Determine if the item isn't visible and scroll to it + if (elBottom >= viewBottom) { + navSidebar.scrollTop = elBottom; + } + + // stop observing now since we've completed the scroll + resizeObserver.unobserve(navSidebar); + } + }); + resizeObserver.observe(navSidebar); + } + } + } +}); diff --git a/docs/site_libs/quarto-search/autocomplete.umd.js b/docs/site_libs/quarto-search/autocomplete.umd.js new file mode 100644 index 0000000..6090a55 --- /dev/null +++ b/docs/site_libs/quarto-search/autocomplete.umd.js @@ -0,0 +1,3 @@ +/*! @algolia/autocomplete-js 1.19.1 | MIT License | Β© Algolia, Inc. and contributors | https://github.com/algolia/autocomplete */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["@algolia/autocomplete-js"]={})}(this,(function(e){"use strict";function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(e){for(var n=1;n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,u,a=[],l=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(a.push(r.value),a.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(c)throw o}}return a}}(e,t)||c(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||c(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function x(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function N(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r=3||2===n&&r>=4||1===n&&r>=10);function i(t,n,r){if(o&&void 0!==r){var i=r[0].__autocomplete_algoliaCredentials,u={"X-Algolia-Application-Id":i.appId,"X-Algolia-API-Key":i.apiKey};e.apply(void 0,[t].concat(D(n),[{headers:u}]))}else e.apply(void 0,[t].concat(D(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setAuthenticatedUserToken:function(t){e("setAuthenticatedUserToken",t)},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDsAfterSearch",B(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("clickedObjectIDs",B(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDsAfterSearch",B(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&i("convertedObjectIDs",B(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n0&&t.reduce((function(e,t){var n=t.items,r=k(t,A);return[].concat(D(e),D(q(N(N({},r),{},{objectIDs:(null==n?void 0:n.map((function(e){return e.objectID})))||r.objectIDs})).map((function(e){return{items:n,payload:e}}))))}),[]).forEach((function(e){var t=e.items;return i("viewedObjectIDs",[e.payload],t)}))},viewedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function L(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function F(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function U(e){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(e)}function M(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return H(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&z({onItemsChange:o,items:n,insights:c,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function o(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:W(W({},a?{clickAnalytics:!0}:{}),e?{userToken:X(e)}:{}),insights:c}})}l("addAlgoliaAgent","insights-plugin"),o(),l("onUserTokenChange",(function(e){o(e)})),l("getUserToken",null,(function(e,t){o(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,o=e.source;F(t)&&i({state:n,event:r,insights:c,item:t,insightsEvents:[W({eventName:"Item Selected"},j({item:t,items:o.getItems().filter(F)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;F(t)&&u({state:r,event:o,insights:c,item:t,insightsEvents:[W({eventName:"Item Active"},j({item:t,items:n.getItems().filter(F)}))]})}))},onStateChange:function(e){var t=e.state;m({state:t})},__autocomplete_pluginOptions:e}}function J(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0;return[].concat(M(t),["autocomplete-internal"],M(null!==(e=n.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function X(e){return"number"==typeof e?e.toString():e}function Y(e,t){var n=t;return{then:function(t,r){return Y(e.then(ee(t,n,e),ee(r,n,e)),n)},catch:function(t){return Y(e.catch(ee(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),Y(e.finally(ee(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach((function(e){e()}))},isCanceled:function(){return!0===n.isCanceled}}}function Z(e){return Y(e,{isCanceled:!1,onCancelList:[]})}function ee(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}var te,ne=!0;function re(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function oe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function ie(e){for(var t=1;t=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,u=!0,a=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return u=e.done,e},e:function(e){a=!0,i=e},f:function(){try{u||null==n.return||n.return()}finally{if(a)throw i}}}}function ce(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0?t.wait(Math.max.apply(Math,o)):void 0};function fe(e){var t=function(e){var t=e.collections.map((function(e){return e.items.length})).reduce((function(e,t,n){var r=(e[n-1]||0)+t;return e.push(r),e}),[]).reduce((function(t,n){return n<=e.activeItemId?t+1:t}),0);return e.collections[t]}(e);if(!t)return null;var n=t.items[function(e){for(var t=e.state,n=e.collection,r=!1,o=0,i=0;!1===r;){var u=t.collections[o];if(u===n){r=!0;break}i+=u.items.length,o++}return t.activeItemId-i}({state:e,collection:t})],r=t.source;return{item:n,itemInputValue:r.getItemInputValue({item:n,state:e}),itemUrl:r.getItemUrl({item:n,state:e}),source:r}}function pe(e,t,n){return[e,null==n?void 0:n.sourceId,t].filter(Boolean).join("-").replace(/\s/g,"")}var me=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function ve(e){return e.nativeEvent||e}function de(e){return de="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},de(e)}function ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function be(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==de(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==de(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===de(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ge(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,i){var u=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:d(),plugins:o,initialState:Ae({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(Pe(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:_,onResolve:_};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=ie(ie({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return m(e)})).then((function(e){return e.map((function(e){return Ae(Ae({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:Ae({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function Ce(e){return Ce="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ce(e)}function ke(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function xe(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Je,Xe,Ye,Ze=null,et=(Je=-1,Xe=-1,Ye=void 0,function(e){var t=++Je;return Promise.resolve(e).then((function(e){return Ye&&t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function lt(e){return lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},lt(e)}var ct=["props","refresh","store"],st=["inputElement","formElement","panelElement"],ft=["inputElement"],pt=["inputElement","maxLength"],mt=["source"],vt=["item","source"];function dt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function yt(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function ht(e){var t=e.props,n=e.refresh,r=e.store,o=gt(e,ct);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,i=e.panelElement;function u(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,i].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return yt({onTouchStart:u,onMouseDown:u,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},gt(e,st))},getRootProps:function(e){return yt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return pe(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":pe(t.id,"label")},e)},getFormProps:function(e){e.inputElement;var i=gt(e,ft),u=function(i){var u;t.onSubmit(yt({event:i,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(u=e.inputElement)||void 0===u||u.blur()};return yt({action:"",noValidate:!0,role:"search",onSubmit:function(e){e.preventDefault();var n=se(t.plugins,r.pendingRequests);void 0!==n?n.then((function(){return u(e)})):u(e)},onReset:function(i){var u;i.preventDefault(),t.onReset(yt({event:i,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(u=e.inputElement)||void 0===u||u.focus()}},i)},getLabelProps:function(e){return yt({htmlFor:pe(t.id,"input"),id:pe(t.id,"label")},e)},getInputProps:function(e){var i;function u(e){(t.openOnFocus||Boolean(r.getState().query))&&tt(yt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var a=e||{};a.inputElement;var l=a.maxLength,c=void 0===l?512:l,s=gt(a,pt),f=fe(r.getState()),p=function(e){return Boolean(e&&e.match(me))}((null===(i=t.environment.navigator)||void 0===i?void 0:i.userAgent)||""),m=t.enterKeyHint||(null!=f&&f.itemUrl&&!p?"go":"search");return yt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?pe(t.id,"item-".concat(r.getState().activeItemId),null==f?void 0:f.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.filter((function(e){return e.items.length>0})).map((function(e){var n=e.source;return pe(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":pe(t.id,"label"),value:r.getState().completion||r.getState().query,id:pe(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:m,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){var i=e.currentTarget.value;t.ignoreCompositionEvents&&ve(e).isComposing?o.setQuery(i):tt(yt({event:e,props:t,query:i.slice(0,c),refresh:n,store:r},o))},onCompositionEnd:function(e){tt(yt({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){ve(e).isComposing||function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,i=at(e,rt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var u=function(){var e=fe(o.getState()),t=n.environment.document.getElementById(pe(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},a=function(){var e=fe(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,u=e.itemInputValue,a=e.itemUrl,l=e.source;l.onActive(it({event:t,item:n,itemInputValue:u,itemUrl:a,refresh:r,source:l,state:o.getState()},i))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?tt(it({event:t,props:n,query:o.getState().query,refresh:r,store:o},i)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),a(),setTimeout(u,0)})):(o.dispatch(t.key,{}),a(),u())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length}))){var l=se(n.plugins,o.pendingRequests);return void(void 0!==l?l.then(o.pendingRequests.cancelAll):n.debug||o.pendingRequests.cancelAll())}t.preventDefault();var c=fe(o.getState()),s=c.item,f=c.itemInputValue,p=c.itemUrl,m=c.source;if(t.metaKey||t.ctrlKey)void 0!==p&&(m.onSelect(it({event:t,item:s,itemInputValue:f,itemUrl:p,refresh:r,source:m,state:o.getState()},i)),n.navigator.navigateNewTab({itemUrl:p,item:s,state:o.getState()}));else if(t.shiftKey)void 0!==p&&(m.onSelect(it({event:t,item:s,itemInputValue:f,itemUrl:p,refresh:r,source:m,state:o.getState()},i)),n.navigator.navigateNewWindow({itemUrl:p,item:s,state:o.getState()}));else if(t.altKey);else{if(void 0!==p)return m.onSelect(it({event:t,item:s,itemInputValue:f,itemUrl:p,refresh:r,source:m,state:o.getState()},i)),void n.navigator.navigate({itemUrl:p,item:s,state:o.getState()});tt(it({event:t,nextState:{isOpen:!1},props:n,query:f,refresh:r,store:o},i)).then((function(){m.onSelect(it({event:t,item:s,itemInputValue:f,itemUrl:p,refresh:r,source:m,state:o.getState()},i))}))}}}(yt({event:e,props:t,refresh:n,store:r},o))},onFocus:u,onBlur:_,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||u(n)}},s)},getPanelProps:function(e){return yt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=gt(n,mt);return yt({role:"listbox","aria-labelledby":pe(t.id,"label"),id:pe(t.id,"list",r)},o)},getItemProps:function(e){var i=e.item,u=e.source,a=gt(e,vt);return yt({id:pe(t.id,"item-".concat(i.__autocomplete_id),u),role:"option","aria-selected":r.getState().activeItemId===i.__autocomplete_id,onMouseMove:function(e){if(i.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",i.__autocomplete_id);var t=fe(r.getState());if(null!==r.getState().activeItemId&&t){var u=t.item,a=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(yt({event:e,item:u,itemInputValue:a,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var a=u.getItemInputValue({item:i,state:r.getState()}),l=u.getItemUrl({item:i,state:r.getState()});(l?Promise.resolve():tt(yt({event:e,nextState:{isOpen:!1},props:t,query:a,refresh:n,store:r},o))).then((function(){u.onSelect(yt({event:e,item:i,itemInputValue:a,itemUrl:l,refresh:n,source:u,state:r.getState()},o))}))}},a)}}}function _t(e){return _t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_t(e)}function Ot(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function St(e){for(var t=1;t=5&&((o||!e&&5===r)&&(u.push(r,0,o,n),r=6),e&&(u.push(r,e,0,n),r=6)),o=""},l=0;l"===t?(r=1,o=""):o=t+o[0]:i?t===i?i="":o+=t:'"'===t||"'"===t?i=t:">"===t?(a(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(a(),3===r&&(u=u[0]),r=u,(u=u[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(a(),r=2):o+=t),3===r&&"!--"===o&&(r=4,u=u[0])}return a(),u}(e)),t),arguments,[])).length>1?t:t[0]}var Ft=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n};function Ut(e,t){if("string"==typeof t){var n=e.document.querySelector(t);return"The element ".concat(JSON.stringify(t)," is not in the document."),n}return t}function Mt(){for(var e=arguments.length,t=new Array(e),n=0;n2&&(u.children=arguments.length>3?on.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(i in e.defaultProps)void 0===u[i]&&(u[i]=e.defaultProps[i]);return gn(e,u,r,o,null)}function gn(e,t,n,r,o){var i={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++an:o};return null==o&&null!=un.vnode&&un.vnode(i),i}function hn(e){return e.children}function _n(e,t){this.props=e,this.context=t}function On(e,t){if(null==t)return e.__?On(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&ln.sort(fn));Pn.__r=0}function wn(e,t,n,r,o,i,u,a,l,c){var s,f,p,m,v,d,y,b=r&&r.__k||mn,g=b.length;for(n.__k=[],s=0;s0?gn(m.type,m.props,m.key,m.ref?m.ref:null,m.__v):m)){if(m.__=n,m.__b=n.__b+1,null===(p=b[s])||p&&m.key==p.key&&m.type===p.type)b[s]=void 0;else for(f=0;f=0;t--)if((n=e.__k[t])&&(r=En(n)))return r;return null}function Dn(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||vn.test(t)?n:n+"px"}function Cn(e,t,n,r,o){var i;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||Dn(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||Dn(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])i=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+i]=n,n?r||e.addEventListener(t,i?xn:kn,i):e.removeEventListener(t,i?xn:kn,i);else if("dangerouslySetInnerHTML"!==t){if(o)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&"-"!==t[4]?e.removeAttribute(t):e.setAttribute(t,n))}}function kn(e){return this.l[e.type+!1](un.event?un.event(e):e)}function xn(e){return this.l[e.type+!0](un.event?un.event(e):e)}function Nn(e,t,n,r,o,i,u,a,l){var c,s,f,p,m,v,d,y,b,g,h,_,O,S,j,P=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(l=n.__h,a=t.__e=n.__e,t.__h=null,i=[a]),(c=un.__b)&&c(t);try{e:if("function"==typeof P){if(y=t.props,b=(c=P.contextType)&&r[c.__c],g=c?b?b.props.value:c.__:r,n.__c?d=(s=t.__c=n.__c).__=s.__E:("prototype"in P&&P.prototype.render?t.__c=s=new P(y,g):(t.__c=s=new _n(y,g),s.constructor=P,s.render=Ln),b&&b.sub(s),s.props=y,s.state||(s.state={}),s.context=g,s.__n=r,f=s.__d=!0,s.__h=[],s._sb=[]),null==s.__s&&(s.__s=s.state),null!=P.getDerivedStateFromProps&&(s.__s==s.state&&(s.__s=dn({},s.__s)),dn(s.__s,P.getDerivedStateFromProps(y,s.__s))),p=s.props,m=s.state,s.__v=t,f)null==P.getDerivedStateFromProps&&null!=s.componentWillMount&&s.componentWillMount(),null!=s.componentDidMount&&s.__h.push(s.componentDidMount);else{if(null==P.getDerivedStateFromProps&&y!==p&&null!=s.componentWillReceiveProps&&s.componentWillReceiveProps(y,g),!s.__e&&null!=s.shouldComponentUpdate&&!1===s.shouldComponentUpdate(y,s.__s,g)||t.__v===n.__v){for(t.__v!==n.__v&&(s.props=y,s.state=s.__s,s.__d=!1),s.__e=!1,t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),h=0;h0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split(Un);r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function Hn(e){return function(e){if(Array.isArray(e))return Vn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Vn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Vn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Vn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n",""":'"',"'":"'"},Kn=new RegExp(/\w/i),$n=/&(amp|quot|lt|gt|#39);/g,zn=RegExp($n.source);function Gn(e,t){var n,r,o,i=e[t],u=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,a=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return Kn.test((o=i.value)&&zn.test(o)?o.replace($n,(function(e){return Qn[e]})):o)||a!==u?i.isHighlighted:a}function Jn(e){return Jn="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Jn(e)}function Xn(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Yn(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function vr(e){return function(e){if(Array.isArray(e))return dr(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return dr(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return dr(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function dr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0;if(!_.value.core.openOnFocus&&!t.query)return n;var r=Boolean(y.current||_.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:wr,options:e}}))})),j=f(n({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},_.value.core.initialState)),P={getEnvironmentProps:_.value.renderer.getEnvironmentProps,getFormProps:_.value.renderer.getFormProps,getInputProps:_.value.renderer.getInputProps,getItemProps:_.value.renderer.getItemProps,getLabelProps:_.value.renderer.getLabelProps,getListProps:_.value.renderer.getListProps,getPanelProps:_.value.renderer.getPanelProps,getRootProps:_.value.renderer.getRootProps},w={setActiveItemId:S.value.setActiveItemId,setQuery:S.value.setQuery,setCollections:S.value.setCollections,setIsOpen:S.value.setIsOpen,setStatus:S.value.setStatus,setContext:S.value.setContext,refresh:S.value.refresh,navigator:S.value.navigator},I=m((function(){return Lt.bind(_.value.renderer.renderer.createElement)})),A=m((function(){return rn({autocomplete:S.value,autocompleteScopeApi:w,classNames:_.value.renderer.classNames,environment:_.value.core.environment,isDetached:O.value,placeholder:_.value.core.placeholder,propGetters:P,setIsModalOpen:k,state:j.current,translations:_.value.renderer.translations})}));function E(){Jt(A.value.panel,{style:O.value?{}:Pr({panelPlacement:_.value.renderer.panelPlacement,container:A.value.root,form:A.value.form,environment:_.value.core.environment})})}function D(e){j.current=e;var t={autocomplete:S.value,autocompleteScopeApi:w,classNames:_.value.renderer.classNames,components:_.value.renderer.components,container:_.value.renderer.container,html:I.value,dom:A.value,panelContainer:O.value?A.value.detachedContainer:_.value.renderer.panelContainer,propGetters:P,state:j.current,renderer:_.value.renderer.renderer},r=!b(e)&&!y.current&&_.value.renderer.renderNoResults||_.value.renderer.render;!function(e){var t=e.autocomplete,r=e.autocompleteScopeApi,o=e.dom,i=e.propGetters,u=e.state;Xt(o.root,i.getRootProps(n({state:u,props:t.getRootProps({})},r))),Xt(o.input,i.getInputProps(n({state:u,props:t.getInputProps({inputElement:o.input}),inputElement:o.input},r))),Jt(o.label,{hidden:"stalled"===u.status}),Jt(o.loadingIndicator,{hidden:"stalled"!==u.status}),Jt(o.clearButton,{hidden:!u.query}),Jt(o.detachedSearchButtonQuery,{textContent:u.query}),Jt(o.detachedSearchButtonPlaceholder,{hidden:Boolean(u.query)})}(t),function(e,t){var r=t.autocomplete,o=t.autocompleteScopeApi,u=t.classNames,a=t.html,l=t.dom,c=t.panelContainer,s=t.propGetters,f=t.state,p=t.components,m=t.renderer;if(f.isOpen){c.contains(l.panel)||"loading"===f.status||c.appendChild(l.panel),l.panel.classList.toggle("aa-Panel--stalled","stalled"===f.status);var v=f.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var l=e.source,c=e.items;return m.createElement("section",{key:t,className:u.source,"data-autocomplete-source-id":l.sourceId},l.templates.header&&m.createElement("div",{className:u.sourceHeader},l.templates.header({components:p,createElement:m.createElement,Fragment:m.Fragment,items:c,source:l,state:f,html:a})),l.templates.noResults&&0===c.length?m.createElement("div",{className:u.sourceNoResults},l.templates.noResults({components:p,createElement:m.createElement,Fragment:m.Fragment,source:l,state:f,html:a})):m.createElement("ul",i({className:u.list},s.getListProps(n({state:f,props:r.getListProps({source:l})},o))),c.map((function(e){var t=r.getItemProps({item:e,source:l});return m.createElement("li",i({key:t.id,className:u.item},s.getItemProps(n({state:f,props:t},o))),l.templates.item({components:p,createElement:m.createElement,Fragment:m.Fragment,item:e,state:f,html:a}))}))),l.templates.footer&&m.createElement("div",{className:u.sourceFooter},l.templates.footer({components:p,createElement:m.createElement,Fragment:m.Fragment,items:c,source:l,state:f,html:a})))})),d=m.createElement(m.Fragment,null,m.createElement("div",{className:u.panelLayout},v),m.createElement("div",{className:"aa-GradientBottom"})),y=v.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(n(n({children:d,state:f,sections:v,elements:y},m),{},{components:p,html:a},o),l.panel)}else c.contains(l.panel)&&c.removeChild(l.panel)}(r,t)}function C(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};l();var t=_.value.renderer,n=t.components,r=u(t,Ir);g.current=Vt(r,_.value.core,{components:Wt(n,(function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")})),initialState:j.current},e),v(),c(),S.value.refresh().then((function(){D(j.current)}))}function k(e){e!==_.value.core.environment.document.body.contains(A.value.detachedOverlay)&&(e?(_.value.core.environment.document.body.appendChild(A.value.detachedOverlay),_.value.core.environment.document.body.classList.add("aa-Detached"),A.value.input.focus()):(_.value.core.environment.document.body.removeChild(A.value.detachedOverlay),_.value.core.environment.document.body.classList.remove("aa-Detached")))}return a((function(){var e=S.value.getEnvironmentProps({formElement:A.value.form,panelElement:A.value.panel,inputElement:A.value.input});return Jt(_.value.core.environment,e),function(){Jt(_.value.core.environment,Object.keys(e).reduce((function(e,t){return n(n({},e),{},o({},t,void 0))}),{}))}})),a((function(){var e=O.value?_.value.core.environment.document.body:_.value.renderer.panelContainer,t=O.value?A.value.detachedOverlay:A.value.panel;return O.value&&j.current.isOpen&&k(!0),D(j.current),function(){e.contains(t)&&(e.removeChild(t),e.classList.remove("aa-Detached"))}})),a((function(){var e=_.value.renderer.container;return e.appendChild(A.value.root),function(){e.removeChild(A.value.root)}})),a((function(){var e=p((function(e){D(e.state)}),0);return h.current=function(t){var n=t.state,r=t.prevState;(O.value&&r.isOpen!==n.isOpen&&k(n.isOpen),O.value||!n.isOpen||r.isOpen||E(),n.query!==r.query)&&_.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){h.current=void 0}})),a((function(){var e=p((function(){var e=O.value;O.value=_.value.core.environment.matchMedia(_.value.renderer.detachedMediaQuery).matches,e!==O.value?C({}):requestAnimationFrame(E)}),20);return _.value.core.environment.addEventListener("resize",e),function(){_.value.core.environment.removeEventListener("resize",e)}})),a((function(){if(!O.value)return function(){};function e(e){A.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=_.value.core.environment.matchMedia(getComputedStyle(_.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),a((function(){return requestAnimationFrame(E),function(){}})),n(n({},w),{},{update:C,destroy:function(){l()}})},e.getAlgoliaFacets=function(e){var t=Ar({transformResponse:function(e){return e.facetHits}}),r=e.queries.map((function(e){return n(n({},e),{},{type:"facet"})}));return t(n(n({},e),{},{queries:r}))},e.getAlgoliaResults=Er,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/docs/site_libs/quarto-search/fuse.min.js b/docs/site_libs/quarto-search/fuse.min.js new file mode 100644 index 0000000..adc2835 --- /dev/null +++ b/docs/site_libs/quarto-search/fuse.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2022 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(C).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),c=parseFloat(Math.round(o*r)/r);return n.set(i,c),c},clear:function(){n.clear()}}}var $=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?I.getFn:n,o=t.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o;r(this,e),this.norm=E(c,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?I.getFn:r,o=n.fieldNormWeight,c=void 0===o?I.fieldNormWeight:o,a=new $({getFn:i,fieldNormWeight:c});return a.setKeys(e.map(_)),a.setSources(t),a.create(),a}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?I.distance:s,h=t.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(a-o);return u?f+d/u:d?1:f}function N(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:I.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}var P=32;function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?I.location:o,a=i.threshold,s=void 0===a?I.threshold:a,u=i.distance,h=void 0===u?I.distance:u,l=i.includeMatches,f=void 0===l?I.includeMatches:l,d=i.findAllMatches,v=void 0===d?I.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?I.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?I.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?I.ignoreLocation:k;if(r(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},x=this.pattern.length;if(x>P){for(var w=0,L=x%P,S=x-L;w3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?I.location:i,c=r.distance,a=void 0===c?I.distance:c,s=r.threshold,u=void 0===s?I.threshold:s,h=r.findAllMatches,l=void 0===h?I.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?I.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?I.includeMatches:v,y=r.ignoreLocation,p=void 0===y?I.ignoreLocation:y;if(t.length>P)throw new Error(w(P));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,L=b,S=d>1||g,_=S?Array(M):[];(m=e.indexOf(t,L))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),L=m+k,S)for(var j=0;j=z;q-=1){var B=q-1,J=n[e.charAt(B)];if(S&&(_[B]=+!!J),K[q]=(K[q+1]<<1|1)&J,F&&(K[q]|=(A[q+1]|A[q])<<1|1|A[q+1]),K[q]&$&&(C=R(t,{errors:F,currentLocation:B,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(L=B)<=b)break;z=Math.max(1,2*b-L)}}if(R(t,{errors:F+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p})>x)break;A=K}var U={isMatch:L>=0,score:Math.max(.001,C)};if(S){var V=N(_,d);V.length?g&&(U.indices=V):U.isMatch=!1}return U}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:l}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(f(d),f(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),z=function(){function e(t){r(this,e),this.pattern=t}return o(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return D(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return D(e,this.singleRegex)}}]),e}();function D(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),n}(z),q=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),n}(z),B=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),n}(z),J=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),n}(z),U=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),n}(z),V=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),n}(z),G=function(e){a(n,e);var t=l(n);function n(e){var i,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?I.location:c,s=o.threshold,u=void 0===s?I.threshold:s,h=o.distance,l=void 0===h?I.distance:h,f=o.includeMatches,d=void 0===f?I.includeMatches:f,v=o.findAllMatches,g=void 0===v?I.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?I.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?I.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?I.ignoreLocation:M;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:a,threshold:u,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),i}return o(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(z),H=function(e){a(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return o(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(z),Q=[K,H,B,J,V,U,q,G],X=Q.length,Y=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;function Z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Y).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,o=void 0===i?I.isCaseSensitive:i,c=n.includeMatches,a=void 0===c?I.includeMatches:c,s=n.minMatchCharLength,u=void 0===s?I.minMatchCharLength:s,h=n.ignoreLocation,l=void 0===h?I.ignoreLocation:h,f=n.findAllMatches,d=void 0===f?I.findAllMatches:f,v=n.location,g=void 0===v?I.location:v,y=n.threshold,p=void 0===y?I.threshold:y,m=n.distance,k=void 0===m?I.distance:m;r(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:l,location:g,threshold:p,distance:k},this.pattern=o?t:t.toLowerCase(),this.query=Z(this.pattern,this.options)}return o(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}function ge(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?I.includeMatches:r,o=n.includeScore,c=void 0===o?I.includeScore:o,a=[];return i&&a.push(de),c&&a.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ye=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},I),i),this.options.useExtendedSearch,this._keyStore=new S(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof $))throw new Error("Incorrect 'index' type");this._myIndex=t||F(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return fe(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),ge(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=re(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n,i=function e(n){var i=Object.keys(n),o=ue(n);if(!o&&i.length>1&&!se(n))return e(le(n));if(he(n)){var c=o?n[ce]:i[0],a=o?n[ae]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return r&&(s.searcher=re(a,t)),s}var u={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return se(e)||(e=le(e)),i(e)}(e,this.options),r=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?I.getFn:n,i=t.fieldNormWeight,o=void 0===i?I.fieldNormWeight:i,c=e.keys,a=e.records,s=new $({getFn:r,fieldNormWeight:o});return s.setKeys(c),s.setIndexRecords(a),s},ye.config=I,function(){ne.push.apply(ne,arguments)}(te),ye},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/docs/site_libs/quarto-search/quarto-search.js b/docs/site_libs/quarto-search/quarto-search.js new file mode 100644 index 0000000..437e38f --- /dev/null +++ b/docs/site_libs/quarto-search/quarto-search.js @@ -0,0 +1,1457 @@ +const kQueryArg = "q"; +const kResultsArg = "show-results"; + +// If items don't provide a URL, then both the navigator and the onSelect +// function aren't called (and therefore, the default implementation is used) +// +// We're using this sentinel URL to signal to those handlers that this +// item is a more item (along with the type) and can be handled appropriately +const kItemTypeMoreHref = "0767FDFD-0422-4E5A-BC8A-3BE11E5BBA05"; + +// Capture search params and clean ?q= from URL at module load time, before +// any DOMContentLoaded handlers run. quarto-nav.js resolves all hrefs +// against window.location during DOMContentLoaded β€” if ?q= is still present, +// every link on the page gets the query param baked into its href. +const currentUrl = new URL(window.location); +const kQuery = currentUrl.searchParams.get(kQueryArg); +if (kQuery) { + const replacementUrl = new URL(window.location); + replacementUrl.searchParams.delete(kQueryArg); + window.history.replaceState({}, "", replacementUrl); +} + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Ensure that search is available on this page. If it isn't, + // should return early and not do anything + var searchEl = window.document.getElementById("quarto-search"); + if (!searchEl) return; + + const { autocomplete } = window["@algolia/autocomplete-js"]; + + let quartoSearchOptions = {}; + let language = {}; + const searchOptionEl = window.document.getElementById( + "quarto-search-options" + ); + if (searchOptionEl) { + const jsonStr = searchOptionEl.textContent; + quartoSearchOptions = JSON.parse(jsonStr); + language = quartoSearchOptions.language; + } + + // note the search mode + if (quartoSearchOptions.type === "overlay") { + searchEl.classList.add("type-overlay"); + } else { + searchEl.classList.add("type-textbox"); + } + + // Used to determine highlighting behavior for this page + // A `q` query param is expected when the user follows a search + // to this page + const query = kQuery; + const showSearchResults = currentUrl.searchParams.get(kResultsArg); + const mainEl = window.document.querySelector("main"); + + // highlight matches on the page + if (query && mainEl) { + highlight(query, mainEl); + + // Activate tabs on pageshow β€” after tabsets.js restores localStorage state. + // tabsets.js registers its pageshow handler during module execution (before + // DOMContentLoaded). By registering ours during DOMContentLoaded, listener + // ordering guarantees we run after tabsets.js β€” so search activation wins. + window.addEventListener("pageshow", function (event) { + if (!event.persisted) { + for (const mark of mainEl.querySelectorAll("mark")) { + openAllTabsetsContainingEl(mark); + } + // Only scroll to first match when there's no hash fragment. + // With a hash, the browser already scrolled to the target section. + if (!currentUrl.hash) { + requestAnimationFrame(() => scrollToFirstVisibleMatch(mainEl)); + } + } + }, { once: true }); + } + + // function to clear highlighting on the page when the search query changes + // (e.g. if the user edits the query or clears it) + let highlighting = true; + const resetHighlighting = (searchTerm) => { + if (mainEl && highlighting && query && searchTerm !== query) { + clearHighlight(query, mainEl); + highlighting = false; + } + }; + + // Responsively switch to overlay mode if the search is present on the navbar + // Note that switching the sidebar to overlay mode requires more coordinate (not just + // the media query since we generate different HTML for sidebar overlays than we do + // for sidebar input UI) + const detachedMediaQuery = + quartoSearchOptions.type === "overlay" ? "all" : "(max-width: 991px)"; + + // If configured, include the analytics client to send insights + const plugins = configurePlugins(quartoSearchOptions); + + let lastState = null; + const { setIsOpen, setQuery, setCollections } = autocomplete({ + container: searchEl, + detachedMediaQuery: detachedMediaQuery, + defaultActiveItemId: 0, + panelContainer: "#quarto-search-results", + panelPlacement: quartoSearchOptions["panel-placement"], + debug: false, + openOnFocus: true, + plugins, + classNames: { + form: "d-flex", + }, + placeholder: language["search-text-placeholder"], + translations: { + clearButtonTitle: language["search-clear-button-title"], + detachedCancelButtonText: language["search-detached-cancel-button-title"], + submitButtonTitle: language["search-submit-button-title"], + }, + initialState: { + query, + }, + getItemUrl({ item }) { + return item.href; + }, + onStateChange({ state }) { + // If this is a file URL, note that + + // Perhaps reset highlighting + resetHighlighting(state.query); + + // If the panel just opened, ensure the panel is positioned properly + if (state.isOpen) { + if (lastState && !lastState.isOpen) { + setTimeout(() => { + positionPanel(quartoSearchOptions["panel-placement"]); + }, 150); + } + } + + // Perhaps show the copy link + showCopyLink(state.query, quartoSearchOptions); + + lastState = state; + }, + reshape({ sources, state }) { + return sources.map((source) => { + try { + const items = source.getItems(); + + // Validate the items + validateItems(items); + + // group the items by document + const groupedItems = new Map(); + items.forEach((item) => { + const hrefParts = item.href.split("#"); + const baseHref = hrefParts[0]; + const isDocumentItem = hrefParts.length === 1; + + const items = groupedItems.get(baseHref); + if (!items) { + groupedItems.set(baseHref, [item]); + } else { + // If the href for this item matches the document + // exactly, place this item first as it is the item that represents + // the document itself + if (isDocumentItem) { + items.unshift(item); + } else { + items.push(item); + } + groupedItems.set(baseHref, items); + } + }); + + const reshapedItems = []; + let count = 1; + for (const [_key, value] of groupedItems) { + const firstItem = value[0]; + reshapedItems.push({ + ...firstItem, + type: kItemTypeDoc, + }); + + const collapseMatches = quartoSearchOptions["collapse-after"]; + const collapseCount = + typeof collapseMatches === "number" ? collapseMatches : 1; + + if (value.length > 1) { + const target = `search-more-${count}`; + const isExpanded = + state.context.expanded && + state.context.expanded.includes(target); + + const remainingCount = value.length - collapseCount; + + for (let i = 1; i < value.length; i++) { + if (collapseMatches && i === collapseCount) { + reshapedItems.push({ + target, + title: isExpanded + ? language["search-hide-matches-text"] + : remainingCount === 1 + ? `${remainingCount} ${language["search-more-match-text"]}` + : `${remainingCount} ${language["search-more-matches-text"]}`, + type: kItemTypeMore, + href: kItemTypeMoreHref, + }); + } + + if (isExpanded || !collapseMatches || i < collapseCount) { + reshapedItems.push({ + ...value[i], + type: kItemTypeItem, + target, + }); + } + } + } + count += 1; + } + + return { + ...source, + getItems() { + return reshapedItems; + }, + }; + } catch (error) { + // Some form of error occurred + return { + ...source, + getItems() { + return [ + { + title: error.name || "An Error Occurred While Searching", + text: + error.message || + "An unknown error occurred while attempting to perform the requested search.", + type: kItemTypeError, + }, + ]; + }, + }; + } + }); + }, + navigator: { + navigate({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + window.location.assign(itemUrl); + } + }, + navigateNewTab({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + const windowReference = window.open(itemUrl, "_blank", "noopener"); + if (windowReference) { + windowReference.focus(); + } + } + }, + navigateNewWindow({ itemUrl }) { + if (itemUrl !== offsetURL(kItemTypeMoreHref)) { + window.open(itemUrl, "_blank", "noopener"); + } + }, + }, + getSources({ state, setContext, setActiveItemId, refresh }) { + return [ + { + sourceId: "documents", + getItemUrl({ item }) { + if (item.href) { + return offsetURL(item.href); + } else { + return undefined; + } + }, + onSelect({ + item, + state, + setContext, + setIsOpen, + setActiveItemId, + refresh, + }) { + if (item.type === kItemTypeMore) { + toggleExpanded(item, state, setContext, setActiveItemId, refresh); + + // Toggle more + setIsOpen(true); + } + }, + getItems({ query }) { + if (query === null || query === "") { + return []; + } + + const limit = quartoSearchOptions.limit; + if (quartoSearchOptions.algolia) { + return algoliaSearch(query, limit, quartoSearchOptions.algolia); + } else { + // Fuse search options + const fuseSearchOptions = { + isCaseSensitive: false, + shouldSort: true, + minMatchCharLength: 2, + limit: limit, + }; + + return readSearchData().then(function (fuse) { + return fuseSearch(query, fuse, fuseSearchOptions); + }); + } + }, + templates: { + noResults({ createElement }) { + const hasQuery = lastState.query; + + return createElement( + "div", + { + class: `quarto-search-no-results${hasQuery ? "" : " no-query" + }`, + }, + language["search-no-results-text"] + ); + }, + header({ items, createElement }) { + // count the documents + const count = items.filter((item) => { + return item.type === kItemTypeDoc; + }).length; + + if (count > 0) { + return createElement( + "div", + { class: "search-result-header" }, + `${count} ${language["search-matching-documents-text"]}` + ); + } else { + return createElement( + "div", + { class: "search-result-header-no-results" }, + `` + ); + } + }, + footer({ _items, createElement }) { + if ( + quartoSearchOptions.algolia && + quartoSearchOptions.algolia["show-logo"] + ) { + const libDir = quartoSearchOptions.algolia["libDir"]; + const logo = createElement("img", { + src: offsetURL( + `${libDir}/quarto-search/search-by-algolia.svg` + ), + class: "algolia-search-logo", + }); + return createElement( + "a", + { href: "http://www.algolia.com/" }, + logo + ); + } + }, + + item({ item, createElement }) { + if (item.text && item.href && !item.href.includes('?q=')) { + const [main, hash] = item.href.split('#') + const hashAppend = hash ? '#' + hash : '' + item.href = main + '?q=' + encodeURIComponent(state.query) + hashAppend + } + + return renderItem( + item, + createElement, + state, + setActiveItemId, + setContext, + refresh, + quartoSearchOptions + ); + }, + }, + }, + ]; + }, + }); + + window.quartoOpenSearch = () => { + setIsOpen(false); + setIsOpen(true); + focusSearchInput(); + }; + + document.addEventListener("keyup", (event) => { + const { key } = event; + const kbds = quartoSearchOptions["keyboard-shortcut"]; + const focusedEl = document.activeElement; + + const isFormElFocused = [ + "input", + "select", + "textarea", + "button", + "option", + ].find((tag) => { + return focusedEl.tagName.toLowerCase() === tag; + }); + + if ( + kbds && + kbds.includes(key) && + !isFormElFocused && + !document.activeElement.isContentEditable + ) { + event.preventDefault(); + window.quartoOpenSearch(); + } + }); + + // Remove the labeleledby attribute since it is pointing + // to a non-existent label + if (quartoSearchOptions.type === "overlay") { + const inputEl = window.document.querySelector( + "#quarto-search .aa-Autocomplete" + ); + if (inputEl) { + inputEl.removeAttribute("aria-labelledby"); + } + } + + function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; + } + + // If the main document scrolls dismiss the search results + // (otherwise, since they're floating in the document they can scroll with the document) + window.document.body.onscroll = throttle(() => { + // Only do this if we're not detached + // Bug #7117 + // This will happen when the keyboard is shown on ios (resulting in a scroll) + // which then closed the search UI + if (!window.matchMedia(detachedMediaQuery).matches) { + setIsOpen(false); + } + }, 50); + + if (showSearchResults) { + setIsOpen(true); + focusSearchInput(); + } +}); + +function configurePlugins(quartoSearchOptions) { + const autocompletePlugins = []; + const algoliaOptions = quartoSearchOptions.algolia; + if ( + algoliaOptions && + algoliaOptions["analytics-events"] && + algoliaOptions["search-only-api-key"] && + algoliaOptions["application-id"] + ) { + const apiKey = algoliaOptions["search-only-api-key"]; + const appId = algoliaOptions["application-id"]; + + // Aloglia insights may not be loaded because they require cookie consent + // Use deferred loading so events will start being recorded when/if consent + // is granted. + const algoliaInsightsDeferredPlugin = deferredLoadPlugin(() => { + if ( + window.aa && + window["@algolia/autocomplete-plugin-algolia-insights"] + ) { + // Check if cookie consent is enabled from search options + const cookieConsentEnabled = algoliaOptions["cookie-consent-enabled"] || false; + + // Generate random session token only when cookies are disabled + const userToken = cookieConsentEnabled ? undefined : Array.from(Array(20), () => + Math.floor(Math.random() * 36).toString(36) + ).join(""); + + window.aa("init", { + appId, + apiKey, + useCookie: cookieConsentEnabled, + userToken: userToken, + }); + + const { createAlgoliaInsightsPlugin } = + window["@algolia/autocomplete-plugin-algolia-insights"]; + // Register the insights client + const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({ + insightsClient: window.aa, + onItemsChange({ insights, insightsEvents }) { + const events = insightsEvents.flatMap((event) => { + // This API limits the number of items per event to 20 + const chunkSize = 20; + const itemChunks = []; + const eventItems = event.items; + for (let i = 0; i < eventItems.length; i += chunkSize) { + itemChunks.push(eventItems.slice(i, i + chunkSize)); + } + // Split the items into multiple events that can be sent + const events = itemChunks.map((items) => { + return { + ...event, + items, + }; + }); + return events; + }); + + for (const event of events) { + insights.viewedObjectIDs(event); + } + }, + }); + return algoliaInsightsPlugin; + } + }); + + // Add the plugin + autocompletePlugins.push(algoliaInsightsDeferredPlugin); + return autocompletePlugins; + } +} + +// For plugins that may not load immediately, create a wrapper +// plugin and forward events and plugin data once the plugin +// is initialized. This is useful for cases like cookie consent +// which may prevent the analytics insights event plugin from initializing +// immediately. +function deferredLoadPlugin(createPlugin) { + let plugin = undefined; + let subscribeObj = undefined; + const wrappedPlugin = () => { + if (!plugin && subscribeObj) { + plugin = createPlugin(); + if (plugin && plugin.subscribe) { + plugin.subscribe(subscribeObj); + } + } + return plugin; + }; + + return { + subscribe: (obj) => { + subscribeObj = obj; + }, + onStateChange: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onStateChange) { + plugin.onStateChange(obj); + } + }, + onSubmit: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onSubmit) { + plugin.onSubmit(obj); + } + }, + onReset: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.onReset) { + plugin.onReset(obj); + } + }, + getSources: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.getSources) { + return plugin.getSources(obj); + } else { + return Promise.resolve([]); + } + }, + data: (obj) => { + const plugin = wrappedPlugin(); + if (plugin && plugin.data) { + plugin.data(obj); + } + }, + }; +} + +function validateItems(items) { + // Validate the first item + if (items.length > 0) { + const item = items[0]; + const missingFields = []; + if (item.href == undefined) { + missingFields.push("href"); + } + if (!item.title == undefined) { + missingFields.push("title"); + } + if (!item.text == undefined) { + missingFields.push("text"); + } + + if (missingFields.length === 1) { + throw { + name: `Error: Search index is missing the ${missingFields[0]} field.`, + message: `The items being returned for this search do not include all the required fields. Please ensure that your index items include the ${missingFields[0]} field or use index-fields in your _quarto.yml file to specify the field names.`, + }; + } else if (missingFields.length > 1) { + const missingFieldList = missingFields + .map((field) => { + return `${field}`; + }) + .join(", "); + + throw { + name: `Error: Search index is missing the following fields: ${missingFieldList}.`, + message: `The items being returned for this search do not include all the required fields. Please ensure that your index items includes the following fields: ${missingFieldList}, or use index-fields in your _quarto.yml file to specify the field names.`, + }; + } + } +} + +let lastQuery = null; +function showCopyLink(query, options) { + const language = options.language; + lastQuery = query; + // Insert share icon + const inputSuffixEl = window.document.body.querySelector( + ".aa-Form .aa-InputWrapperSuffix" + ); + + if (inputSuffixEl) { + let copyButtonEl = window.document.body.querySelector( + ".aa-Form .aa-InputWrapperSuffix .aa-CopyButton" + ); + + if (copyButtonEl === null) { + copyButtonEl = window.document.createElement("button"); + copyButtonEl.setAttribute("class", "aa-CopyButton"); + copyButtonEl.setAttribute("type", "button"); + copyButtonEl.setAttribute("title", language["search-copy-link-title"]); + copyButtonEl.onmousedown = (e) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const linkIcon = "bi-clipboard"; + const checkIcon = "bi-check2"; + + const shareIconEl = window.document.createElement("i"); + shareIconEl.setAttribute("class", `bi ${linkIcon}`); + copyButtonEl.appendChild(shareIconEl); + inputSuffixEl.prepend(copyButtonEl); + + const clipboard = new window.ClipboardJS(".aa-CopyButton", { + text: function (_trigger) { + const copyUrl = new URL(window.location); + copyUrl.searchParams.set(kQueryArg, lastQuery); + copyUrl.searchParams.set(kResultsArg, "1"); + return copyUrl.toString(); + }, + }); + clipboard.on("success", function (e) { + // Focus the input + + // button target + const button = e.trigger; + const icon = button.querySelector("i.bi"); + + // flash "checked" + icon.classList.add(checkIcon); + icon.classList.remove(linkIcon); + setTimeout(function () { + icon.classList.remove(checkIcon); + icon.classList.add(linkIcon); + }, 1000); + }); + } + + // If there is a query, show the link icon + if (copyButtonEl) { + if (lastQuery && options["copy-button"]) { + copyButtonEl.style.display = "flex"; + } else { + copyButtonEl.style.display = "none"; + } + } + } +} + +/* Search Index Handling */ +// create the index +var fuseIndex = undefined; +var shownWarning = false; + +// fuse index options +const kFuseIndexOptions = { + keys: [ + { name: "title", weight: 20 }, + { name: "section", weight: 20 }, + { name: "text", weight: 10 }, + ], + ignoreLocation: true, + threshold: 0.1, +}; + +async function readSearchData() { + // Initialize the search index on demand + if (fuseIndex === undefined) { + if (window.location.protocol === "file:" && !shownWarning) { + window.alert( + "Search requires JavaScript features disabled when running in file://... URLs. In order to use search, please run this document in a web server." + ); + shownWarning = true; + return; + } + const fuse = new window.Fuse([], kFuseIndexOptions); + + // fetch the main search.json + const response = await fetch(offsetURL("search.json")); + if (response.status == 200) { + return response.json().then(function (searchDocs) { + searchDocs.forEach(function (searchDoc) { + fuse.add(searchDoc); + }); + fuseIndex = fuse; + return fuseIndex; + }); + } else { + return Promise.reject( + new Error( + "Unexpected status from search index request: " + response.status + ) + ); + } + } + + return fuseIndex; +} + +function inputElement() { + return window.document.body.querySelector(".aa-Form .aa-Input"); +} + +function focusSearchInput() { + setTimeout(() => { + const inputEl = inputElement(); + if (inputEl) { + inputEl.focus(); + } + }, 50); +} + +/* Panels */ +const kItemTypeDoc = "document"; +const kItemTypeMore = "document-more"; +const kItemTypeItem = "document-item"; +const kItemTypeError = "error"; + +function renderItem( + item, + createElement, + state, + setActiveItemId, + setContext, + refresh, + quartoSearchOptions +) { + switch (item.type) { + case kItemTypeDoc: + return createDocumentCard( + createElement, + "file-richtext", + item.title, + item.section, + item.text, + item.href, + item.crumbs, + quartoSearchOptions + ); + case kItemTypeMore: + return createMoreCard( + createElement, + item, + state, + setActiveItemId, + setContext, + refresh + ); + case kItemTypeItem: + return createSectionCard( + createElement, + item.section, + item.text, + item.href + ); + case kItemTypeError: + return createErrorCard(createElement, item.title, item.text); + default: + return undefined; + } +} + +function createDocumentCard( + createElement, + icon, + title, + section, + text, + href, + crumbs, + quartoSearchOptions +) { + const iconEl = createElement("i", { + class: `bi bi-${icon} search-result-icon`, + }); + const titleEl = createElement("p", { class: "search-result-title" }, title); + const titleContents = [iconEl, titleEl]; + const showParent = quartoSearchOptions["show-item-context"]; + if (crumbs && showParent) { + let crumbsOut = undefined; + const crumbClz = ["search-result-crumbs"]; + if (showParent === "root") { + crumbsOut = crumbs.length > 1 ? crumbs[0] : undefined; + } else if (showParent === "parent") { + crumbsOut = crumbs.length > 1 ? crumbs[crumbs.length - 2] : undefined; + } else { + crumbsOut = crumbs.length > 1 ? crumbs.join(" > ") : undefined; + crumbClz.push("search-result-crumbs-wrap"); + } + + const crumbEl = createElement( + "p", + { class: crumbClz.join(" ") }, + crumbsOut + ); + titleContents.push(crumbEl); + } + + const titleContainerEl = createElement( + "div", + { class: "search-result-title-container" }, + titleContents + ); + + const textEls = []; + if (section) { + const sectionEl = createElement( + "p", + { class: "search-result-section" }, + section + ); + textEls.push(sectionEl); + } + const descEl = createElement("p", { + class: "search-result-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + textEls.push(descEl); + + const textContainerEl = createElement( + "div", + { class: "search-result-text-container" }, + textEls + ); + + const containerEl = createElement( + "div", + { + class: "search-result-container", + }, + [titleContainerEl, textContainerEl] + ); + + const linkEl = createElement( + "a", + { + href: offsetURL(href), + class: "search-result-link", + }, + containerEl + ); + + const classes = ["search-result-doc", "search-item"]; + if (!section) { + classes.push("document-selectable"); + } + + return createElement( + "div", + { + class: classes.join(" "), + }, + linkEl + ); +} + +function createMoreCard( + createElement, + item, + state, + setActiveItemId, + setContext, + refresh +) { + const moreCardEl = createElement( + "div", + { + class: "search-result-more search-item", + onClick: (e) => { + // Handle expanding the sections by adding the expanded + // section to the list of expanded sections + toggleExpanded(item, state, setContext, setActiveItemId, refresh); + e.stopPropagation(); + }, + }, + item.title + ); + + return moreCardEl; +} + +function toggleExpanded(item, state, setContext, setActiveItemId, refresh) { + const expanded = state.context.expanded || []; + if (expanded.includes(item.target)) { + setContext({ + expanded: expanded.filter((target) => target !== item.target), + }); + } else { + setContext({ expanded: [...expanded, item.target] }); + } + + refresh(); + setActiveItemId(item.__autocomplete_id); +} + +function createSectionCard(createElement, section, text, href) { + const sectionEl = createSection(createElement, section, text, href); + return createElement( + "div", + { + class: "search-result-doc-section search-item", + }, + sectionEl + ); +} + +function createSection(createElement, title, text, href) { + const descEl = createElement("p", { + class: "search-result-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + + const titleEl = createElement("p", { class: "search-result-section" }, title); + const linkEl = createElement( + "a", + { + href: offsetURL(href), + class: "search-result-link", + }, + [titleEl, descEl] + ); + return linkEl; +} + +function createErrorCard(createElement, title, text) { + const descEl = createElement("p", { + class: "search-error-text", + dangerouslySetInnerHTML: { + __html: text, + }, + }); + + const titleEl = createElement("p", { + class: "search-error-title", + dangerouslySetInnerHTML: { + __html: ` ${title}`, + }, + }); + const errorEl = createElement("div", { class: "search-error" }, [ + titleEl, + descEl, + ]); + return errorEl; +} + +function positionPanel(pos) { + const panelEl = window.document.querySelector( + "#quarto-search-results .aa-Panel" + ); + const inputEl = window.document.querySelector( + "#quarto-search .aa-Autocomplete" + ); + + if (panelEl && inputEl) { + panelEl.style.top = `${Math.round(panelEl.offsetTop)}px`; + if (pos === "start") { + panelEl.style.left = `${Math.round(inputEl.left)}px`; + } else { + panelEl.style.right = `${Math.round(inputEl.offsetRight)}px`; + } + } +} + +/* Highlighting */ +// highlighting functions +function highlightMatch(query, text) { + if (text) { + const start = text.toLowerCase().indexOf(query.toLowerCase()); + if (start !== -1) { + const startMark = ""; + const endMark = ""; + + const end = start + query.length; + text = + text.slice(0, start) + + startMark + + text.slice(start, end) + + endMark + + text.slice(end); + const startInfo = clipStart(text, start); + const endInfo = clipEnd( + text, + startInfo.position + startMark.length + endMark.length + ); + text = + startInfo.prefix + + text.slice(startInfo.position, endInfo.position) + + endInfo.suffix; + + return text; + } else { + return text; + } + } else { + return text; + } +} + +function clipStart(text, pos) { + const clipStart = pos - 50; + if (clipStart < 0) { + // This will just return the start of the string + return { + position: 0, + prefix: "", + }; + } else { + // We're clipping before the start of the string, walk backwards to the first space. + const spacePos = findSpace(text, pos, -1); + return { + position: spacePos.position, + prefix: "", + }; + } +} + +function clipEnd(text, pos) { + const clipEnd = pos + 200; + if (clipEnd > text.length) { + return { + position: text.length, + suffix: "", + }; + } else { + const spacePos = findSpace(text, clipEnd, 1); + return { + position: spacePos.position, + suffix: spacePos.clipped ? "…" : "", + }; + } +} + +function findSpace(text, start, step) { + let stepPos = start; + while (stepPos > -1 && stepPos < text.length) { + const char = text[stepPos]; + if (char === " " || char === "," || char === ":") { + return { + position: step === 1 ? stepPos : stepPos - step, + clipped: stepPos > 1 && stepPos < text.length, + }; + } + stepPos = stepPos + step; + } + + return { + position: stepPos - step, + clipped: false, + }; +} + +// removes highlighting as implemented by the mark tag +function clearHighlight(searchterm, el) { + const childNodes = el.childNodes; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + if (node.nodeType === Node.ELEMENT_NODE) { + if ( + node.tagName === "MARK" && + node.innerText.toLowerCase() === searchterm.toLowerCase() + ) { + el.replaceChild(document.createTextNode(node.innerText), node); + } else { + clearHighlight(searchterm, node); + } + } + } +} + +/** Get all html nodes under the given `root` that don't have children. */ +function getLeafNodes(root) { + let leaves = []; + + function traverse(node) { + if (node.childNodes.length === 0) { + leaves.push(node); + } else { + node.childNodes.forEach(traverse); + } + } + + traverse(root); + return leaves; +} +/** create and return `${txt}` */ +const markEl = txt => { + const el = document.createElement("mark"); + el.appendChild(document.createTextNode(txt)); + return el +} +/** get all ancestors of an element matching the given css selector */ +const matchAncestors = (el, selector) => { + let ancestors = []; + while (el) { + if (el.matches?.(selector)) ancestors.push(el); + el = el.parentNode; + } + return ancestors; +}; + +const isWhitespace = s => s.trim().length === 0 +// ================= +// MATCHING CODE +// ================= +const initMatch = () => ({ + i: 0, + lohisByNode: new Map() +}) +/** + * keeps track of the start (lo) and end (hi) index of the match per node (leaf) + * note: mutates the contents of `matchContext` + */ +const advanceMatch = (leaf, leafi, matchContext) => { + matchContext.i++ + + const curLoHi = matchContext.lohisByNode.get(leaf) + + matchContext.lohisByNode.set(leaf, { lo: curLoHi?.lo ?? leafi, hi: leafi }) +} +/** + * Finds all non-overlapping matches for a search string in the document. + * The search string may be split between multiple consecutive leaf nodes. + * + * Whitespace in the search string must be present in the document to match, but + * there may be addititional whitespace in the document that is ignored. + * + * e.g. searching for `dogs rock` would match `dogs \n rock`, + * and would contribute the match + * `{ i:9, els: new Map([[textNode, {lo:0, hi:8}],[spanNode,{lo:0,hi:5}]]) }` + * + * @returns {Map[]} + */ +function searchMatches(inSearch, el) { + // searchText has all sequences of whitespace replaced by a single space + const searchText = inSearch.toLowerCase().replace(/\s+/g, ' ') + const leafNodes = getLeafNodes(el) + + /** @type {Map[]} */ + const matches = [] + /** @type {{i:number; els:Map}[]} */ + let curMatchContext = initMatch() + + for (const leaf of leafNodes) { + const leafStr = leaf.textContent.toLowerCase() + // for each character in this leaf's text: + for (let leafi = 0; leafi < leafStr.length; leafi++) { + + if (isWhitespace(leafStr[leafi])) { + // if there is at least one whitespace in the document + // we advance over a search text whitespace. + if (isWhitespace(searchText[curMatchContext.i])) advanceMatch(leaf, leafi, curMatchContext) + // all sequences of whitespace are otherwise ignored. + } else { + if (searchText[curMatchContext.i] === leafStr[leafi]) { + advanceMatch(leaf, leafi, curMatchContext) + } else { + curMatchContext = initMatch() + // if current character in the document did not match at i in the search text, + // reset the search and see if that character matches at 0 in the search text. + if (searchText[curMatchContext.i] === leafStr[leafi]) advanceMatch(leaf, leafi, curMatchContext) + } + } + + const isMatchComplete = curMatchContext.i === searchText.length + if (isMatchComplete) { + matches.push(curMatchContext.lohisByNode) + curMatchContext = initMatch() + } + } + } + + return matches +} + +/** + * e.g. `markMatches(myTextNode, [[0,5],[12,15]])` would wrap the + * character sequences in myTextNode from 0-5 and 12-15 in marks. + * Its important to mark all sequences in a text node at once + * because this function replaces the entire text node; so any + * other references to that text node will no longer be in the DOM. + */ +function markMatches(node, lohis) { + const text = node.nodeValue + + const markFragment = document.createDocumentFragment(); + + let prevHi = 0 + for (const [lo, hi] of lohis) { + markFragment.append( + document.createTextNode(text.slice(prevHi, lo)), + markEl(text.slice(lo, hi + 1)) + ) + prevHi = hi + 1 + } + markFragment.append( + document.createTextNode(text.slice(prevHi, text.length)) + ) + + const parent = node.parentElement + parent?.replaceChild(markFragment, node) + return parent +} + +// Activate ancestor tabs so a search match inside an inactive pane becomes visible. +// When multiple panes in the same tabset contain matches, avoid switching away from +// the currently active pane β€” the user already sees a match there. +function openAllTabsetsContainingEl(el) { + for (const pane of matchAncestors(el, '.tab-pane')) { + const tabContent = pane.closest('.tab-content'); + if (!tabContent) continue; + const activePane = tabContent.querySelector(':scope > .tab-pane.active'); + if (activePane?.querySelector('mark')) continue; + const tabButton = document.querySelector(`[data-bs-target="#${pane.id}"]`); + if (tabButton) new bootstrap.Tab(tabButton).show(); + } +} + +function scrollToFirstVisibleMatch(mainEl) { + for (const mark of mainEl.querySelectorAll("mark")) { + const isMarkVisible = matchAncestors(mark, '.tab-pane').every(markTabPane => + markTabPane.classList.contains("active") + ) + if (isMarkVisible) { + mark.scrollIntoView({ behavior: "smooth", block: "center" }); + return; + } + } +} + +/** + * e.g. + * ```js + * const m = new Map() + * + * arrayMapPush(m, 'dog', 'Max') + * console.log(m) // Map { dog->['Max'] } + * + * arrayMapPush(m, 'dog', 'Samba') + * arrayMapPush(m, 'cat', 'Scruffle') + * console.log(m) // Map { dog->['Max', 'Samba'], cat->['Scruffle'] } + * ``` + */ +const arrayMapPush = (map, key, item) => { + if (!map.has(key)) map.set(key, []) + map.set(key, [...map.get(key), item]) +} + +// copy&paste any string from a quarto page and +// this should find that string in the page and highlight it. +// exception: text that starts outside/inside a tabset and ends +// inside/outside that tabset. +function highlight(searchStr, el) { + const matches = searchMatches(searchStr, el); + + const matchesGroupedByNode = new Map() + for (const match of matches) { + for (const [mel, { lo, hi }] of match) { + arrayMapPush(matchesGroupedByNode, mel, [lo, hi]) + } + } + + for (const [node, lohis] of matchesGroupedByNode) { + markMatches(node, lohis) + } +} + +/* Link Handling */ +// get the offset from this page for a given site root relative url +function offsetURL(url) { + var offset = getMeta("quarto:offset"); + return offset ? offset + url : url; +} + +// read a meta tag value +function getMeta(metaName) { + var metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; +} + +function algoliaSearch(query, limit, algoliaOptions) { + const { getAlgoliaResults } = window["@algolia/autocomplete-preset-algolia"]; + + const applicationId = algoliaOptions["application-id"]; + const searchOnlyApiKey = algoliaOptions["search-only-api-key"]; + const indexName = algoliaOptions["index-name"]; + const indexFields = algoliaOptions["index-fields"]; + const searchClient = window.algoliasearch(applicationId, searchOnlyApiKey); + const searchParams = algoliaOptions["params"]; + const searchAnalytics = !!algoliaOptions["analytics-events"]; + + return getAlgoliaResults({ + searchClient, + queries: [ + { + indexName: indexName, + query, + params: { + hitsPerPage: limit, + clickAnalytics: searchAnalytics, + ...searchParams, + }, + }, + ], + transformResponse: (response) => { + if (!indexFields) { + return response.hits.map((hit) => { + return hit.map((item) => { + return { + ...item, + text: highlightMatch(query, item.text), + }; + }); + }); + } else { + const remappedHits = response.hits.map((hit) => { + return hit.map((item) => { + const newItem = { ...item }; + ["href", "section", "title", "text", "crumbs"].forEach( + (keyName) => { + const mappedName = indexFields[keyName]; + if ( + mappedName && + item[mappedName] !== undefined && + mappedName !== keyName + ) { + newItem[keyName] = item[mappedName]; + delete newItem[mappedName]; + } + } + ); + newItem.text = highlightMatch(query, newItem.text); + return newItem; + }); + }); + return remappedHits; + } + }, + }); +} + +let subSearchTerm = undefined; +let subSearchFuse = undefined; +const kFuseMaxWait = 125; + +async function fuseSearch(query, fuse, fuseOptions) { + let index = fuse; + // Fuse.js using the Bitap algorithm for text matching which runs in + // O(nm) time (no matter the structure of the text). In our case this + // means that long search terms mixed with large index gets very slow + // + // This injects a subIndex that will be used once the terms get long enough + // Usually making this subindex is cheap since there will typically be + // a subset of results matching the existing query + if (subSearchFuse !== undefined && query.startsWith(subSearchTerm)) { + // Use the existing subSearchFuse + index = subSearchFuse; + } else if (subSearchFuse !== undefined) { + // The term changed, discard the existing fuse + subSearchFuse = undefined; + subSearchTerm = undefined; + } + + // Search using the active fuse + const then = performance.now(); + const resultsRaw = await index.search(query, fuseOptions); + const now = performance.now(); + + const results = resultsRaw.map((result) => { + const addParam = (url, name, value) => { + const anchorParts = url.split("#"); + const baseUrl = anchorParts[0]; + const sep = baseUrl.search("\\?") > 0 ? "&" : "?"; + anchorParts[0] = baseUrl + sep + name + "=" + value; + return anchorParts.join("#"); + }; + + return { + title: result.item.title, + section: result.item.section, + href: addParam(result.item.href, kQueryArg, query), + text: highlightMatch(query, result.item.text), + crumbs: result.item.crumbs, + }; + }); + + // If we don't have a subfuse and the query is long enough, go ahead + // and create a subfuse to use for subsequent queries + if ( + now - then > kFuseMaxWait && + subSearchFuse === undefined && + resultsRaw.length < fuseOptions.limit + ) { + subSearchTerm = query; + subSearchFuse = new window.Fuse([], kFuseIndexOptions); + resultsRaw.forEach((rr) => { + subSearchFuse.add(rr.item); + }); + } + return results; +} diff --git a/docs/sitemap.xml b/docs/sitemap.xml new file mode 100644 index 0000000..85b60d0 --- /dev/null +++ b/docs/sitemap.xml @@ -0,0 +1,45 @@ + + + + https://mkennedy.codes/docs/python-switch/ + 2026-06-11 + weekly + 1.0 + + + https://mkennedy.codes/docs/python-switch/reference/ + 2026-06-11 + monthly + 0.8 + + + https://mkennedy.codes/docs/python-switch/reference/closed_range.html + 2026-06-11 + monthly + 0.8 + + + https://mkennedy.codes/docs/python-switch/reference/switch.html + 2026-06-11 + monthly + 0.8 + + + https://mkennedy.codes/docs/python-switch/changelog.html + 2026-06-11 + weekly + 0.6 + + + https://mkennedy.codes/docs/python-switch/license.html + 2026-06-11 + monthly + 0.5 + + + https://mkennedy.codes/docs/python-switch/skills.html + 2026-06-11 + monthly + 0.5 + + \ No newline at end of file diff --git a/docs/skill.md b/docs/skill.md new file mode 100644 index 0000000..194f161 --- /dev/null +++ b/docs/skill.md @@ -0,0 +1,40 @@ +--- +name: switchlang +description: > + Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package. +license: MIT +compatibility: Requires Python >=3.9. +--- + +# switchlang + +Adds switch blocks to the Python language. + +## Installation + +```bash +pip install switchlang +``` + +## API overview + +### The switch block + +The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. + + +- `switch`: switch is a module-level implementation of the switch statement for Python + +### Range helpers + +Helpers for mapping ranges of values to a single case. + + +- `closed_range`: Creates a closed range that allows you to specify a case + +## Resources + +- [Full documentation](https://mkennedy.codes/docs/python-switch/) +- [llms.txt](llms.txt) β€” Indexed API reference for LLMs +- [llms-full.txt](llms-full.txt) β€” Comprehensive documentation for LLMs +- [Source code](https://github.com/mikeckennedy/python-switch) diff --git a/docs/skills.html b/docs/skills.html new file mode 100644 index 0000000..ac094be --- /dev/null +++ b/docs/skills.html @@ -0,0 +1,635 @@ + + + + + + + + + +Skills – switchlang | switchlang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/termshow.css b/docs/termshow.css new file mode 100644 index 0000000..fa68925 --- /dev/null +++ b/docs/termshow.css @@ -0,0 +1,649 @@ +/* Great Docs Termshow Player Styles */ + +/* Embedded JetBrains Mono subset (OFL license) β€” includes box-drawing chars */ +@font-face { + font-family: "JetBrains Mono"; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url(JetBrainsMono-Regular.subset.woff2) format("woff2"); + unicode-range: U+0020-007E, U+00A0-00FF, U+2010-2027, U+2190-219F, + U+2500-257F, U+2580-259F, U+25A0-25C0, U+2298, U+2605-2606, + U+2705, U+2714, U+2716, U+2718, U+26A0; +} + +@font-face { + font-family: "JetBrains Mono"; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url(JetBrainsMono-Bold.subset.woff2) format("woff2"); + unicode-range: U+0020-007E, U+00A0-00FF, U+2010-2027, U+2190-219F, + U+2500-257F, U+2580-259F, U+25A0-25C0, U+2298, U+2605-2606, + U+2705, U+2714, U+2716, U+2718, U+26A0; +} + +.gd-termshow { + --gd-tp-bg: #1e1e2e; + --gd-tp-fg: #cdd6f4; + --gd-tp-border: #313244; + --gd-tp-accent: #89b4fa; + --gd-tp-controls-bg: #181825; + --gd-tp-progress-bg: #45475a; + --gd-tp-chapter-color: #f9e2af; + --gd-tp-ann-bg: rgba(30, 30, 46, 0.88); + --gd-tp-ann-border: rgba(137, 180, 250, 0.4); + --gd-tp-radius: 8px; + + position: relative; + border-radius: var(--gd-tp-radius); + overflow: hidden; + border: 1px solid var(--gd-tp-border); + max-width: 100%; + margin: 1.5em 0; + background: var(--gd-tp-bg); + container-type: inline-size; + overflow-anchor: none; +} + +/* Prevent any player internals from being used as scroll anchors */ +.gd-termshow * { + overflow-anchor: none; +} + +/* Viewport */ +.gd-tp-viewport { + position: relative; + width: 100%; + overflow: hidden; + outline: none; + container-type: inline-size; + user-select: none; + -webkit-user-select: none; +} + +.gd-tp-viewport:focus-visible { + box-shadow: inset 0 0 0 2px var(--gd-tp-accent); +} + +.gd-tp-svg { + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.gd-tp-svg svg { + width: 100%; + height: auto; + display: block; + margin-top: -2px; +} + +/* Poster image (before JS loads) */ +.gd-termshow-poster { + width: 100%; + height: auto; + display: block; +} + +/* Annotations */ +.gd-tp-annotations { + position: absolute; + inset: 0; + pointer-events: none; + padding: 12px; + contain: layout style; +} + +/* Highlights overlay β€” top: -2px matches the SVG's margin-top: -2px */ +.gd-tp-highlights { + position: absolute; + top: -2px; + left: 0; + right: 0; + bottom: 0; + pointer-events: none; + contain: layout style; + z-index: 1; +} + +.gd-tp-highlight { + --hl-color: #f1fa8c; + transition: opacity 0.15s ease; + box-sizing: border-box; + border-radius: max(1px, 0.426cqi); +} + +/* Styles */ +.gd-tp-hl-outline { + box-shadow: 0 0 0 max(1px, 0.284cqi) var(--hl-color); +} + +.gd-tp-hl-underline { + border-bottom: max(1px, 0.284cqi) solid var(--hl-color); + border-radius: 0; +} + +.gd-tp-hl-underline-wavy { + border-radius: 0; +} +.gd-tp-hl-underline-wavy::after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: max(2px, 0.568cqi); + background-color: var(--hl-color); + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='4' viewBox='0 0 8 4'%3E%3Cpath d='M0 2Q2 0 4 2Q6 4 8 2' fill='none' stroke='black' stroke-width='1.5'/%3E%3C/svg%3E"); + -webkit-mask-repeat: repeat-x; + -webkit-mask-size: max(4px, 1.136cqi) max(2px, 0.568cqi); + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='4' viewBox='0 0 8 4'%3E%3Cpath d='M0 2Q2 0 4 2Q6 4 8 2' fill='none' stroke='black' stroke-width='1.5'/%3E%3C/svg%3E"); + mask-repeat: repeat-x; + mask-size: max(4px, 1.136cqi) max(2px, 0.568cqi); +} + +.gd-tp-hl-background { + background: color-mix(in srgb, var(--hl-color) 20%, transparent); +} + +.gd-tp-hl-spotlight { + background: color-mix(in srgb, var(--hl-color) 10%, transparent); + box-shadow: 0 0 max(8px, 2.84cqi) color-mix(in srgb, var(--hl-color) 40%, transparent); +} + +.gd-tp-hl-glow { + box-shadow: 0 0 max(4px, 1.136cqi) max(1px, 0.284cqi) var(--hl-color), inset 0 0 max(2px, 0.568cqi) max(1px, 0.142cqi) color-mix(in srgb, var(--hl-color) 30%, transparent); +} + +.gd-tp-hl-box { + border: max(1px, 0.284cqi) solid var(--hl-color); + background: color-mix(in srgb, var(--hl-color) 10%, transparent); +} + +.gd-tp-hl-bracket { + border-left: max(2px, 0.426cqi) solid var(--hl-color); + border-radius: 0; +} + +.gd-tp-hl-badge-before, +.gd-tp-hl-badge-after { + border: max(1px, 0.213cqi) solid var(--hl-color); +} + +.gd-tp-hl-badge { + position: absolute; + background: var(--hl-color); + color: #1e1e2e; + font-size: max(7px, 1.42cqi); + font-weight: 600; + padding: max(1px, 0.142cqi) max(3px, 0.71cqi); + border-radius: max(1px, 0.426cqi); + white-space: nowrap; + line-height: 1.3; +} + +.gd-tp-hl-badge-before .gd-tp-hl-badge { + top: max(-14px, -1.989cqi); + left: 0; +} + +.gd-tp-hl-badge-after .gd-tp-hl-badge { + bottom: max(-14px, -1.989cqi); + left: 0; +} + +/* Pulse animation */ +@keyframes gd-tp-hl-pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +.gd-tp-hl-pulse { + animation: gd-tp-hl-pulse 1.5s ease-in-out infinite; +} + +.gd-tp-annotation { + position: absolute; + padding: clamp(4px, 1.2cqi, 10px) clamp(6px, 1.8cqi, 14px); + border-radius: 6px; + font-size: clamp(10px, 2cqi, 14px); + line-height: 1.4; + color: var(--gd-tp-fg); + transition: opacity 0.3s ease; +} + +.gd-tp-ann-callout { + background: var(--gd-tp-ann-bg); + border: 1px solid var(--gd-tp-ann-border); + backdrop-filter: blur(4px); +} + +.gd-tp-ann-subtle { + background: rgba(30, 30, 46, 0.7); + font-size: clamp(9px, 1.8cqi, 12px); + backdrop-filter: blur(4px); +} + +.gd-tp-ann-highlight { + background: rgba(249, 226, 175, 0.15); + border: 1px solid rgba(249, 226, 175, 0.4); + color: #f9e2af; + backdrop-filter: blur(4px); +} + +/* Annotation positions */ +.gd-tp-ann-top-left { + top: clamp(6px, 1.8cqi, 14px); + left: clamp(6px, 1.8cqi, 14px); +} + +.gd-tp-ann-top-right { + top: clamp(6px, 1.8cqi, 14px); + right: clamp(6px, 1.8cqi, 14px); +} + +.gd-tp-ann-top { + top: clamp(6px, 1.8cqi, 14px); + left: 0; + right: 0; + margin-inline: auto; + width: fit-content; +} + +.gd-tp-ann-bottom-left { + bottom: clamp(6px, 1.8cqi, 14px); + left: clamp(6px, 1.8cqi, 14px); +} + +.gd-tp-ann-bottom-right { + bottom: clamp(6px, 1.8cqi, 14px); + right: clamp(6px, 1.8cqi, 14px); +} + +.gd-tp-ann-bottom { + bottom: clamp(6px, 1.8cqi, 14px); + left: 0; + right: 0; + margin-inline: auto; + width: fit-content; +} + +.gd-tp-ann-left { + top: 0; + bottom: 0; + left: clamp(6px, 1.8cqi, 14px); + margin-block: auto; + height: fit-content; +} + +.gd-tp-ann-right { + top: 0; + bottom: 0; + right: clamp(6px, 1.8cqi, 14px); + margin-block: auto; + height: fit-content; +} + +/* Annotation widths */ +.gd-tp-annotation { max-width: 50%; } +.gd-tp-ann-w-small { max-width: 25%; } +.gd-tp-ann-w-large { max-width: 75%; } + +/* Controls bar */ +.gd-tp-controls { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; + background: var(--gd-tp-controls-bg); + border-top: 1px solid var(--gd-tp-border); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + font-size: 13px; + color: var(--gd-tp-fg); + user-select: none; + -webkit-user-select: none; +} + +.gd-tp-play-btn, +.gd-tp-speed-btn { + background: none; + border: none; + color: var(--gd-tp-fg); + cursor: pointer; + padding: 4px 8px; + border-radius: 4px; + font-size: 14px; + line-height: 1; + transition: background 0.15s; +} + +.gd-tp-play-btn { + width: 32px; + display: inline-flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + border: 1px solid var(--gd-tp-progress-bg); +} + +.gd-tp-play-btn:hover, +.gd-tp-speed-btn:hover { + background: var(--gd-tp-progress-bg); +} + +.gd-tp-speed-btn { + font-size: 12px; + font-weight: 600; + width: 40px; + text-align: center; + flex-shrink: 0; +} + +.gd-tp-time, +.gd-tp-duration { + font-size: 12px; + font-variant-numeric: tabular-nums; + opacity: 0.8; + min-width: 36px; +} + +/* Timeline */ +.gd-tp-timeline { + flex: 1; + height: 6px; + background: var(--gd-tp-progress-bg); + border-radius: 3px; + cursor: pointer; + position: relative; + transition: height 0.15s; +} + +.gd-tp-timeline:hover { + height: 8px; +} + +.gd-tp-progress { + height: 100%; + background: var(--gd-tp-accent); + border-radius: 0 3px 3px 0; + width: 0%; + transition: width 0.05s linear; + position: relative; +} + +/* Playhead handle */ +.gd-tp-progress::after { + content: ''; + position: absolute; + right: -5px; + top: 50%; + width: 10px; + height: 10px; + border-radius: 50%; + background: #b4d0fc; + border: 2px solid #ffffff; + transform: translateY(-50%) scale(0); + transition: transform 0.15s ease, box-shadow 0.15s ease; + box-shadow: 0 0 0 2px rgba(137, 180, 250, 0.4); +} + +.gd-tp-timeline:hover .gd-tp-progress::after, +.gd-tp-timeline.gd-tp-dragging .gd-tp-progress::after { + transform: translateY(-50%) scale(1); +} + +.gd-tp-timeline.gd-tp-dragging .gd-tp-progress::after { + width: 14px; + height: 14px; + right: -7px; + box-shadow: 0 0 0 3px rgba(137, 180, 250, 0.5); +} + +.gd-tp-timeline.gd-tp-dragging { + height: 8px; +} + +.gd-tp-timeline.gd-tp-dragging .gd-tp-progress { + transition: none; +} + +/* Chapter markers */ +.gd-tp-chapter-marker { + position: absolute; + top: -2px; + width: 3px; + height: calc(100% + 4px); + background: var(--gd-tp-chapter-color); + border-radius: 1px; + transform: translateX(-50%); + opacity: 0.8; + z-index: 1; +} + +/* Wider hit target for chapter markers */ +.gd-tp-chapter-marker::before { + content: ''; + position: absolute; + top: -4px; + left: -8px; + right: -8px; + bottom: -4px; + cursor: pointer; +} + +.gd-tp-chapter-marker:hover { + opacity: 1; + transform: translateX(-50%) scaleY(1.3); +} + +/* Center overlay button (play / replay) */ +.gd-tp-center-overlay { + position: absolute; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + z-index: 5; + cursor: pointer; +} + +.gd-tp-center-overlay-btn { + width: 64px; + height: 64px; + border-radius: 50%; + background: rgba(0, 0, 0, 0.4); + border: 2px solid rgba(255, 255, 255, 0.2); + color: rgba(255, 255, 255, 0.75); + font-size: 28px; + display: flex; + align-items: center; + justify-content: center; + transition: background 0.2s, transform 0.15s, opacity 0.2s; + backdrop-filter: blur(2px); +} + +.gd-tp-center-overlay:hover .gd-tp-center-overlay-btn { + background: rgba(0, 0, 0, 0.55); + color: rgba(255, 255, 255, 0.9); + transform: scale(1.08); +} + +.gd-tp-center-overlay-btn .gd-tp-icon-play { + /* Shift right slightly to visually center the triangle */ + margin-left: 3px; +} + +/* Hide overlay while playing or when paused at a chapter */ +.gd-termshow.gd-tp-playing .gd-tp-center-overlay, +.gd-termshow.gd-tp-chapter-paused .gd-tp-center-overlay { + display: none; +} + +/* Show overlay only at initial state and ended state */ +.gd-termshow.gd-tp-ended .gd-tp-center-overlay { + display: flex; +} + +/* Reduced motion */ +@media (prefers-reduced-motion: reduce) { + .gd-tp-annotation { + transition: none; + } + + .gd-tp-progress { + transition: none; + } + + .gd-tp-cursor { + animation: none !important; + } +} + +/* Title bar */ +.gd-tp-chapter-bar { + position: relative; + padding: clamp(4px, 1cqi, 8px) clamp(8px, 1.8cqi, 14px); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + font-size: clamp(10px, 2.2cqi, 14px); + font-weight: 500; + color: rgba(255, 255, 255, 0.85); + background: var(--gd-tp-bg); + border-bottom: 1px solid var(--gd-tp-border); + min-height: clamp(22px, 5cqi, 36px); + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + -webkit-user-select: none; +} + +.gd-tp-chapter-bar:empty:not(.gd-tp-has-chrome) { + display: none; +} + +.gd-tp-chapter-text { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* Traffic light decorations */ +.gd-tp-traffic-lights { + position: absolute; + left: clamp(8px, 1.8cqi, 16px); + top: 0; + bottom: 0; + display: flex; + align-items: center; + gap: clamp(4px, 0.9cqi, 8px); +} + +.gd-tp-traffic-dot { + width: clamp(7px, 1.6cqi, 12px); + height: clamp(7px, 1.6cqi, 12px); + border-radius: 50%; +} + +.gd-tp-dot-close { background: #f38ba8; } +.gd-tp-dot-minimize { background: #f9e2af; } +.gd-tp-dot-maximize { background: #a6e3a1; } + +/* Minimal chrome: muted dots */ +.gd-tp-traffic-lights.gd-tp-chrome-minimal .gd-tp-dot-close, +.gd-tp-traffic-lights.gd-tp-chrome-minimal .gd-tp-dot-minimize, +.gd-tp-traffic-lights.gd-tp-chrome-minimal .gd-tp-dot-maximize { + background: #585b70; +} + +/* Light theme overrides (Quarto body[data-bs-theme="light"]) */ +body[data-bs-theme="light"] .gd-termshow, +:root:not([data-bs-theme="dark"]) .gd-termshow.gd-tp-light { + --gd-tp-bg: #eff1f5; + --gd-tp-fg: #4c4f69; + --gd-tp-border: #ccd0da; + --gd-tp-accent: #1e66f5; + --gd-tp-controls-bg: #e6e9ef; + --gd-tp-progress-bg: #ccd0da; + --gd-tp-chapter-color: #df8e1d; + --gd-tp-ann-bg: rgba(239, 241, 245, 0.92); + --gd-tp-ann-border: rgba(30, 102, 245, 0.3); +} + +/* Copy-snippet layer */ +.gd-tp-snippets { + position: absolute; + right: 0; + top: 0; + bottom: 0; + padding-right: clamp(8px, 1.8cqi, 14px); + pointer-events: none; + z-index: 4; + display: flex; + align-items: center; + justify-content: flex-end; + gap: 6px; +} + +.gd-tp-copy-snippet { + pointer-events: auto; + display: inline-flex; + align-items: center; + gap: 4px; + padding: 3px 8px; + border: 1px solid rgba(137, 180, 250, 0.4); + border-radius: 4px; + background: rgba(30, 30, 46, 0.7); + backdrop-filter: blur(4px); + color: var(--gd-tp-fg); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + font-size: clamp(9px, 1.8cqi, 11px); + cursor: pointer; + transition: opacity 0.3s ease, background 0.15s, border-color 0.15s, transform 0.1s; + white-space: nowrap; +} + +.gd-tp-copy-snippet:hover { + background: rgba(30, 30, 46, 0.95); + border-color: var(--gd-tp-accent); + transform: scale(1.03); +} + +.gd-tp-copy-snippet:active { + transform: scale(0.97); +} + +.gd-tp-copy-snippet.gd-tp-copied { + border-color: #a6e3a1; + background: rgba(166, 227, 161, 0.15); +} + +.gd-tp-copy-snippet.gd-tp-copied .gd-tp-copy-label::after { + content: ' \2713'; +} + +.gd-tp-copy-label { + max-width: 120px; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Light theme copy button */ +body[data-bs-theme="light"] .gd-tp-copy-snippet, +:root:not([data-bs-theme="dark"]) .gd-termshow.gd-tp-light .gd-tp-copy-snippet { + background: rgba(239, 241, 245, 0.92); + border-color: rgba(30, 102, 245, 0.3); + color: var(--gd-tp-fg); +} + +body[data-bs-theme="light"] .gd-tp-copy-snippet:hover, +:root:not([data-bs-theme="dark"]) .gd-termshow.gd-tp-light .gd-tp-copy-snippet:hover { + border-color: var(--gd-tp-accent); + background: rgba(239, 241, 245, 0.98); +} diff --git a/docs/termshow.js b/docs/termshow.js new file mode 100644 index 0000000..7fc7c2e --- /dev/null +++ b/docs/termshow.js @@ -0,0 +1,1035 @@ +/** + * Great Docs Termshow Player + * + * A lightweight player for pre-rendered SVG terminal recordings. + * Loads a manifest.json and displays keyframe SVGs with timeline navigation, + * chapter markers, annotations, and keyboard controls. + */ +(function () { + 'use strict'; + + const PLAYER_CLASS = 'gd-termshow'; + const ACTIVE_CLASS = 'gd-tp-active'; + + /** + * Fetch a resource as text or JSON, with file:// fallback via XHR. + */ + function fetchResource(url, asJson) { + if (window.location.protocol === 'file:') { + return new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onload = function () { + if (xhr.status === 0 || xhr.status === 200) { + resolve(asJson ? JSON.parse(xhr.responseText) : xhr.responseText); + } else { + reject(new Error('XHR ' + xhr.status)); + } + }; + xhr.onerror = function () { reject(new Error('XHR network error')); }; + xhr.send(); + }); + } + return fetch(url).then(function (r) { + if (!r.ok) throw new Error('HTTP ' + r.status); + return asJson ? r.json() : r.text(); + }); + } + + /** + * Initialize all termshow player instances on the page. + */ + function initAll() { + const players = document.querySelectorAll(`.${PLAYER_CLASS}`); + players.forEach((el) => initPlayer(el)); + } + + /** + * Initialize a single termshow player instance. + */ + function initPlayer(container) { + const manifestUrl = container.dataset.manifest; + if (!manifestUrl) return; + + // Prevent double-init + if (container.classList.contains(ACTIVE_CLASS)) return; + container.classList.add(ACTIVE_CLASS); + + const options = { + autoplay: container.dataset.autoplay === 'true', + speed: parseFloat(container.dataset.speed) || 1.0, + pauseOnChapters: container.dataset.pauseOnChapters === 'true', + loop: container.dataset.loop === 'true', + }; + + // Create player state + const state = { + manifest: null, + frames: null, + currentTime: 0, + playing: false, + ended: false, + chapterPaused: false, + currentKeyframeIdx: -1, + animFrameId: null, + lastTick: null, + speed: options.speed, + baseUrl: manifestUrl.substring(0, manifestUrl.lastIndexOf('/') + 1), + }; + + // Try to read inline manifest + frames (embedded by Lua filter) + var inlineManifest = null; + var inlineFrames = null; + var manifestEl = container.querySelector('script.gd-tp-manifest'); + var framesEl = container.querySelector('script.gd-tp-frames'); + if (manifestEl) { + try { inlineManifest = JSON.parse(manifestEl.textContent); } catch (e) {} + } + if (framesEl) { + try { inlineFrames = JSON.parse(framesEl.textContent); } catch (e) {} + } + + // Title bar (separate from viewport, above it) + const chapterBar = document.createElement('div'); + chapterBar.className = 'gd-tp-chapter-bar'; + + // Build player DOM + const viewport = document.createElement('div'); + viewport.className = 'gd-tp-viewport'; + // Defer tabindex until user interaction to prevent Safari from treating + // auto-playing players as scroll-restoration targets. + if (!options.autoplay) { + viewport.setAttribute('tabindex', '0'); + } + viewport.setAttribute('role', 'application'); + viewport.setAttribute('aria-label', 'Terminal recording player'); + + const svgContainer = document.createElement('div'); + svgContainer.className = 'gd-tp-svg'; + viewport.appendChild(svgContainer); + + const highlightLayer = document.createElement('div'); + highlightLayer.className = 'gd-tp-highlights'; + viewport.appendChild(highlightLayer); + state.highlightLayer = highlightLayer; + + const annotationLayer = document.createElement('div'); + annotationLayer.className = 'gd-tp-annotations'; + viewport.appendChild(annotationLayer); + + // Copy-snippet buttons (placed in chapter/title bar) + const snippetLayer = document.createElement('div'); + snippetLayer.className = 'gd-tp-snippets'; + chapterBar.appendChild(snippetLayer); + state.snippetLayer = snippetLayer; + + // Center overlay (play / replay) + const centerOverlay = document.createElement('div'); + centerOverlay.className = 'gd-tp-center-overlay'; + centerOverlay.setAttribute('aria-hidden', 'true'); + const centerBtn = document.createElement('div'); + centerBtn.className = 'gd-tp-center-overlay-btn'; + centerBtn.innerHTML = '\u25b6'; + centerOverlay.appendChild(centerBtn); + viewport.appendChild(centerOverlay); + + const controls = buildControls(); + + // Replace container content with player structure + container.innerHTML = ''; + container.appendChild(chapterBar); + container.appendChild(viewport); + container.appendChild(controls.root); + + // Initialize with manifest (inline or fetched) + function activate(manifest, frames) { + state.manifest = manifest; + state.frames = frames; + controls.duration.textContent = formatTime(manifest.duration); + renderChapterMarkers(controls.timeline, manifest); + + // Add traffic light decorations if window_chrome is set + var chrome = manifest.window_chrome || 'none'; + var hasChapters = manifest.chapters && manifest.chapters.length > 0; + var hasSnippets = manifest.snippets && manifest.snippets.length > 0; + if (chrome === 'none' && !hasChapters && !hasSnippets) { + chapterBar.style.display = 'none'; + } else if (chrome !== 'none') { + chapterBar.classList.add('gd-tp-has-chrome'); + var lights = document.createElement('div'); + lights.className = 'gd-tp-traffic-lights' + (chrome === 'minimal' ? ' gd-tp-chrome-minimal' : ''); + lights.innerHTML = '' + + '' + + ''; + chapterBar.appendChild(lights); + } + + // Add a span for chapter text (so traffic lights aren't overwritten) + var chapterText = document.createElement('span'); + chapterText.className = 'gd-tp-chapter-text'; + chapterBar.appendChild(chapterText); + state.chapterText = chapterText; + + updateChapterBar(chapterBar, manifest, 0); + // Show initial frame + showFrame(state, svgContainer, 0); + if (options.autoplay) { + play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar); + } + } + + if (inlineManifest) { + // Always try fetching the external manifest first (it reflects the latest + // termshow render without requiring an HTML rebuild). Fall back to inline + // data if the fetch fails (file:// protocol, offline, etc.). + fetchResource(manifestUrl, true) + .then(function (manifest) { activate(manifest, null); }) + .catch(function () { activate(inlineManifest, inlineFrames); }); + } else { + // No inline data: fetch is the only option + fetchResource(manifestUrl, true) + .then(function (manifest) { activate(manifest, null); }) + .catch(function (err) { + console.warn('[termshow] Failed to load manifest:', manifestUrl, err); + }); + } + + // Restore tabindex on first user interaction (for keyboard nav) + function ensureTabindex() { + if (!viewport.hasAttribute('tabindex')) { + viewport.setAttribute('tabindex', '0'); + } + } + + // Event listeners + controls.playBtn.addEventListener('click', () => { + ensureTabindex(); + if (state.playing) { + pause(state, controls, container, centerOverlay); + } else if (state.ended) { + // Return to initial state (don't autoplay) + state.ended = false; + state.currentTime = 0; + state.currentKeyframeIdx = -1; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + updateDisplay(state, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + } else { + play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar); + } + }); + + centerOverlay.addEventListener('click', () => { + ensureTabindex(); + if (state.ended) { + // Return to initial state (don't autoplay) + state.ended = false; + state.currentTime = 0; + state.currentKeyframeIdx = -1; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + updateDisplay(state, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + return; + } + play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar); + }); + + // Double-click/tap on viewport: left 30% rewinds 5s, right 30% fast-forwards 5s + // Uses pointerdown for immediate, reliable detection unaffected by overlay state + var vpTapTime = 0; + var vpTapX = 0; + + function handleViewportSeek(clientX) { + if (!state.manifest) return; + var rect = viewport.getBoundingClientRect(); + var x = clientX - rect.left; + var w = rect.width; + var newTime; + if (x < w * 0.3) { + newTime = Math.max(0, state.currentTime - 5); + } else if (x > w * 0.7) { + newTime = Math.min(state.manifest.duration, state.currentTime + 5); + } else { + return; // Middle 40% β€” no action + } + if (state.ended) { + state.ended = false; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + } + seek(state, newTime, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + } + + viewport.addEventListener('pointerdown', (e) => { + if (!state.manifest) return; + if (e.target.closest('.gd-tp-controls')) return; + if (!state.playing && !state.ended) return; // Let center overlay handle paused state + var now = Date.now(); + var dx = Math.abs(e.clientX - vpTapX); + if (now - vpTapTime < 400 && dx < 50) { + vpTapTime = 0; + handleViewportSeek(e.clientX); + } else { + vpTapTime = now; + vpTapX = e.clientX; + } + }); + + controls.timeline.addEventListener('mousedown', (e) => { + if (!state.manifest) return; + // If the click landed on a chapter marker, snap to it instead of starting drag + var markerEl = e.target.closest('.gd-tp-chapter-marker'); + if (markerEl) { + var chapterTime = parseFloat(markerEl.dataset.time); + if (!isNaN(chapterTime)) { + if (state.ended) { + state.ended = false; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + } + state.chapterPaused = false; + container.classList.remove('gd-tp-chapter-paused'); + seek(state, chapterTime, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + } + return; + } + e.preventDefault(); + var wasPlaying = state.playing; + if (state.playing) { + pause(state, controls, container, centerOverlay); + } + controls.timeline.classList.add('gd-tp-dragging'); + // Reset ended/chapter-paused state + if (state.ended) { + state.ended = false; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + } + state.chapterPaused = false; + container.classList.remove('gd-tp-chapter-paused'); + + function seekFromEvent(ev) { + var rect = controls.timeline.getBoundingClientRect(); + var ratio = Math.max(0, Math.min(1, (ev.clientX - rect.left) / rect.width)); + seek(state, ratio * state.manifest.duration, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + } + + seekFromEvent(e); + + function onMove(ev) { + ev.preventDefault(); + seekFromEvent(ev); + } + + function onUp() { + controls.timeline.classList.remove('gd-tp-dragging'); + document.removeEventListener('mousemove', onMove); + document.removeEventListener('mouseup', onUp); + if (wasPlaying) { + play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar); + } + } + + document.addEventListener('mousemove', onMove); + document.addEventListener('mouseup', onUp); + }); + + // Touch support for timeline drag + controls.timeline.addEventListener('touchstart', (e) => { + if (!state.manifest) return; + e.preventDefault(); + var wasPlaying = state.playing; + if (state.playing) { + pause(state, controls, container, centerOverlay); + } + controls.timeline.classList.add('gd-tp-dragging'); + if (state.ended) { + state.ended = false; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + } + state.chapterPaused = false; + container.classList.remove('gd-tp-chapter-paused'); + + function seekFromTouch(ev) { + var touch = ev.touches[0] || ev.changedTouches[0]; + var rect = controls.timeline.getBoundingClientRect(); + var ratio = Math.max(0, Math.min(1, (touch.clientX - rect.left) / rect.width)); + seek(state, ratio * state.manifest.duration, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + } + + seekFromTouch(e); + + function onTouchMove(ev) { + ev.preventDefault(); + seekFromTouch(ev); + } + + function onTouchEnd() { + controls.timeline.classList.remove('gd-tp-dragging'); + document.removeEventListener('touchmove', onTouchMove); + document.removeEventListener('touchend', onTouchEnd); + if (wasPlaying) { + play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar); + } + } + + document.addEventListener('touchmove', onTouchMove, { passive: false }); + document.addEventListener('touchend', onTouchEnd); + }, { passive: false }); + + // Speed control + controls.speedBtn.addEventListener('click', () => { + const speeds = [0.5, 1, 1.5, 2, 3]; + const idx = speeds.indexOf(state.speed); + state.speed = speeds[(idx + 1) % speeds.length]; + controls.speedBtn.textContent = state.speed + '\u00d7'; + }); + + // Keyboard navigation + viewport.addEventListener('keydown', (e) => { + if (!state.manifest) return; + + switch (e.key) { + case ' ': + e.preventDefault(); + if (state.playing) pause(state, controls, container, centerOverlay); + else if (state.ended) { + state.ended = false; + state.currentTime = 0; + state.currentKeyframeIdx = -1; + controls.playBtn.textContent = '\u25b6'; + controls.playBtn.setAttribute('aria-label', 'Play'); + centerBtn.innerHTML = '\u25b6'; + container.classList.remove('gd-tp-ended'); + updateDisplay(state, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, state.manifest, state.currentTime); + } else { + play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar); + } + break; + case 'ArrowRight': + e.preventDefault(); + seek(state, state.currentTime + 5, svgContainer, annotationLayer, controls); + break; + case 'ArrowLeft': + e.preventDefault(); + seek(state, state.currentTime - 5, svgContainer, annotationLayer, controls); + break; + case '.': + e.preventDefault(); + nextChapter(state, svgContainer, annotationLayer, controls); + break; + case ',': + e.preventDefault(); + prevChapter(state, svgContainer, annotationLayer, controls); + break; + } + }); + } + + // --- Playback --- + + function play(state, svgContainer, annotationLayer, controls, options, container, centerOverlay, chapterBar) { + state.playing = true; + state.ended = false; + state.chapterPaused = false; + state.lastTick = performance.now(); + controls.playBtn.innerHTML = ''; + controls.playBtn.setAttribute('aria-label', 'Pause'); + container.classList.add('gd-tp-playing'); + container.classList.remove('gd-tp-ended'); + container.classList.remove('gd-tp-chapter-paused'); + + function tick(now) { + if (!state.playing) return; + + const dt = ((now - state.lastTick) / 1000) * state.speed; + state.lastTick = now; + state.currentTime += dt; + + const manifest = state.manifest; + if (state.currentTime >= manifest.duration) { + if (options.loop) { + state.currentTime = 0; + } else { + state.currentTime = manifest.duration; + state.ended = true; + pause(state, controls, container, centerOverlay); + // Show replay icon in controls and overlay + controls.playBtn.textContent = '\u21ba'; // β†Ί + controls.playBtn.setAttribute('aria-label', 'Replay'); + centerOverlay.querySelector('.gd-tp-center-overlay-btn').innerHTML = + '\u21ba'; + container.classList.remove('gd-tp-playing'); + container.classList.add('gd-tp-ended'); + return; + } + } + + // Check chapter pause + if (options.pauseOnChapters && manifest.chapters.length > 0) { + const prevTime = state.currentTime - dt; + for (const ch of manifest.chapters) { + if (ch.time > 0 && prevTime < ch.time && state.currentTime >= ch.time) { + state.currentTime = ch.time; + state.chapterPaused = true; + pause(state, controls, container, centerOverlay); + updateDisplay(state, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, manifest, state.currentTime); + return; + } + } + } + + updateDisplay(state, svgContainer, annotationLayer, controls); + updateChapterBar(chapterBar, manifest, state.currentTime); + state.animFrameId = requestAnimationFrame(tick); + } + + state.animFrameId = requestAnimationFrame(tick); + } + + function pause(state, controls, container, centerOverlay) { + state.playing = false; + if (state.animFrameId) { + cancelAnimationFrame(state.animFrameId); + state.animFrameId = null; + } + if (!state.ended) { + controls.playBtn.textContent = '\u25b6'; // β–Ά + controls.playBtn.setAttribute('aria-label', 'Play'); + } + if (container) { + container.classList.remove('gd-tp-playing'); + // Hide center overlay on chapter pauses (only show at start/end) + if (state.chapterPaused) { + container.classList.add('gd-tp-chapter-paused'); + } else { + container.classList.remove('gd-tp-chapter-paused'); + } + } + } + + function seek(state, time, svgContainer, annotationLayer, controls) { + state.currentTime = Math.max(0, Math.min(time, state.manifest.duration)); + updateDisplay(state, svgContainer, annotationLayer, controls); + } + + function nextChapter(state, svgContainer, annotationLayer, controls) { + if (!state.manifest || !state.manifest.chapters.length) return; + for (const ch of state.manifest.chapters) { + if (ch.time > state.currentTime + 0.1) { + seek(state, ch.time, svgContainer, annotationLayer, controls); + return; + } + } + } + + function prevChapter(state, svgContainer, annotationLayer, controls) { + if (!state.manifest || !state.manifest.chapters.length) return; + const chapters = state.manifest.chapters; + for (let i = chapters.length - 1; i >= 0; i--) { + if (chapters[i].time < state.currentTime - 0.5) { + seek(state, chapters[i].time, svgContainer, annotationLayer, controls); + return; + } + } + seek(state, 0, svgContainer, annotationLayer, controls); + } + + // --- Display --- + + function updateDisplay(state, svgContainer, annotationLayer, controls) { + const manifest = state.manifest; + if (!manifest) return; + + // Update timeline progress + const progress = manifest.duration > 0 ? state.currentTime / manifest.duration : 0; + controls.progress.style.width = (progress * 100) + '%'; + controls.time.textContent = formatTime(state.currentTime); + controls.duration.textContent = formatTime(manifest.duration - state.currentTime); + + // Find the correct keyframe for current time + const kfIdx = findKeyframeIndex(manifest.keyframes, state.currentTime); + if (kfIdx !== state.currentKeyframeIdx) { + state.currentKeyframeIdx = kfIdx; + showFrame(state, svgContainer, kfIdx); + } + + // Update annotations + updateAnnotations(annotationLayer, manifest.annotations, state.currentTime); + + // Update highlights + if (state.highlightLayer) { + updateHighlights(state.highlightLayer, manifest.highlights, state.currentTime, svgContainer); + } + + // Update copy-snippet buttons + updateSnippets(state.snippetLayer, manifest.snippets, state.currentTime, svgContainer); + } + + function updateChapterBar(chapterBar, manifest, time) { + var textEl = chapterBar.querySelector('.gd-tp-chapter-text'); + if (!textEl) return; + if (!manifest || !manifest.chapters || manifest.chapters.length === 0) { + textEl.textContent = ''; + return; + } + // Find the current chapter (last one at or before current time) + var label = ''; + for (let i = manifest.chapters.length - 1; i >= 0; i--) { + if (manifest.chapters[i].time <= time + 0.05) { + label = manifest.chapters[i].label || ''; + break; + } + } + textEl.textContent = label; + } + + function showFrame(state, svgContainer, idx) { + const manifest = state.manifest; + if (!manifest || idx < 0 || idx >= manifest.keyframes.length) return; + + // Pin height before replacing innerHTML to prevent layout collapse. + // All frames in a recording share the same dimensions, so we pin once + // and keep it for the lifetime of playback. This prevents Safari's + // scroll-preservation heuristic from firing on the last player where + // even a sub-frame height flicker affects scrollHeight. + if (!svgContainer.style.minHeight) { + var pinHeight = svgContainer.offsetHeight; + if (pinHeight > 0) { + svgContainer.style.minHeight = pinHeight + 'px'; + } + } + + // Use inline frames if available (no fetch needed) + if (state.frames && state.frames[idx]) { + svgContainer.innerHTML = state.frames[idx]; + return; + } + + // Fallback: fetch the SVG file + const kf = manifest.keyframes[idx]; + const svgUrl = state.baseUrl + kf.file; + + fetchResource(svgUrl, false) + .then((svg) => { + svgContainer.innerHTML = svg; + }) + .catch(() => {}); + } + + function findKeyframeIndex(keyframes, time) { + // Find the last keyframe at or before the current time + let idx = 0; + for (let i = keyframes.length - 1; i >= 0; i--) { + if (keyframes[i].time <= time) { + idx = i; + break; + } + } + return idx; + } + + function updateAnnotations(layer, annotations, time) { + if (!annotations || annotations.length === 0) { + for (var i = 0; i < layer.children.length; i++) { + layer.children[i].style.opacity = '0'; + } + return; + } + + // Pre-create elements with full styling at init time. Once created, ONLY + // opacity is mutated per-frame. This prevents Safari from re-evaluating + // position styles (top/bottom/margin-block) during playback, which triggers + // its scroll-position recalculation bug. + if (!layer._annEls) { + layer._annEls = []; + for (var j = 0; j < annotations.length; j++) { + var ann0 = annotations[j]; + var el = document.createElement('div'); + var wCls = ann0.width && ann0.width !== 'medium' ? ' gd-tp-ann-w-' + ann0.width : ''; + el.className = 'gd-tp-annotation gd-tp-ann-' + ann0.position + ' gd-tp-ann-' + ann0.style + wCls; + el.textContent = ann0.text; + el.style.opacity = '0'; + el.setAttribute('aria-hidden', 'true'); + layer.appendChild(el); + layer._annEls.push(el); + } + } + + for (var k = 0; k < annotations.length; k++) { + var ann = annotations[k]; + var node = layer._annEls[k]; + if (time >= ann.time && time <= ann.time + ann.duration) { + // Fade progress (for smooth entry/exit) + var elapsed = time - ann.time; + var fadeIn = Math.min(1, elapsed / 0.3); + var fadeOut = Math.min(1, (ann.duration - elapsed) / 0.3); + node.style.opacity = Math.min(fadeIn, fadeOut); + } else { + if (node.style.opacity !== '0') node.style.opacity = '0'; + } + } + } + + function updateHighlights(layer, highlights, time, svgContainer) { + if (!highlights || highlights.length === 0) { + if (layer._hlEls) { + for (var i = 0; i < layer._hlEls.length; i++) { + layer._hlEls[i].style.opacity = '0'; + } + } + return; + } + + // Pre-create highlight elements once + if (!layer._hlEls) { + layer._hlEls = []; + for (var j = 0; j < highlights.length; j++) { + var hl = highlights[j]; + var el = document.createElement('div'); + el.className = 'gd-tp-highlight gd-tp-hl-' + hl.style; + el.style.cssText = 'position:absolute;pointer-events:none;opacity:0;'; + if (hl.color) { + el.style.setProperty('--hl-color', hl.color); + } + if (hl.pulse) { + el.classList.add('gd-tp-hl-pulse'); + } + // Badge content + if ((hl.style === 'badge-before' || hl.style === 'badge-after') && (hl.badge_text || hl.badge_icon)) { + var badge = document.createElement('span'); + badge.className = 'gd-tp-hl-badge'; + badge.textContent = (hl.badge_icon || '') + (hl.badge_text || ''); + el.appendChild(badge); + } + el.setAttribute('aria-hidden', 'true'); + layer.appendChild(el); + layer._hlEls.push(el); + } + } + + // Measure grid in viewBox coordinates (cacheable β€” never changes with resize) + var grid = layer._grid; + if (!grid) { + grid = measureViewBoxGrid(svgContainer); + if (grid) layer._grid = grid; + } + + for (var k = 0; k < highlights.length; k++) { + var h = highlights[k]; + var node = layer._hlEls[k]; + if (time >= h.time && time <= h.time + h.duration) { + var elapsed = time - h.time; + var fadeInDur = h.fade_in != null ? h.fade_in : 0.3; + var fadeOutDur = h.fade_out != null ? h.fade_out : 0.3; + var fadeIn = fadeInDur > 0 ? Math.min(1, elapsed / fadeInDur) : 1; + var fadeOut = fadeOutDur > 0 ? Math.min(1, (h.duration - elapsed) / fadeOutDur) : 1; + node.style.opacity = Math.min(fadeIn, fadeOut); + + // Position using percentage of viewBox (scales with SVG responsively) + if (grid && h.target && h.target.region) { + var r = h.target.region; + var x = grid.translateX + r.col * grid.cellW; + var y = grid.translateY + r.row * grid.cellH; + var w = r.width * grid.cellW; + var hh = r.height * grid.cellH; + node.style.left = (x / grid.vbW * 100) + '%'; + node.style.top = (y / grid.vbH * 100) + '%'; + node.style.width = (w / grid.vbW * 100) + '%'; + node.style.height = (hh / grid.vbH * 100) + '%'; + } else if (grid && h.target && h.target.lines) { + var lines = h.target.lines; + var minLine = Math.min.apply(null, lines); + var maxLine = Math.max.apply(null, lines); + var ly = grid.translateY + minLine * grid.cellH; + var lh = (maxLine - minLine + 1) * grid.cellH; + node.style.left = '0%'; + node.style.top = (ly / grid.vbH * 100) + '%'; + node.style.width = '100%'; + node.style.height = (lh / grid.vbH * 100) + '%'; + } + } else { + if (node.style.opacity !== '0') node.style.opacity = '0'; + } + } + } + + /** + * Measure character grid in viewBox coordinates (SVG units). + * Returns {vbW, vbH, cellW, cellH, translateX, translateY} or null. + * These values are resolution-independent and never change with browser width. + */ + function measureViewBoxGrid(svgContainer) { + var svg = svgContainer.querySelector('svg'); + if (!svg) return null; + + // Get viewBox dimensions + var viewBox = svg.getAttribute('viewBox'); + if (!viewBox) return null; + var parts = viewBox.split(/\s+|,/); + var vbW = parseFloat(parts[2]); + var vbH = parseFloat(parts[3]); + if (!vbW || !vbH) return null; + + // Find the that wraps text content + var g = svg.querySelector('g[transform]'); + var translateX = 0, translateY = 0; + if (g) { + var m = g.getAttribute('transform').match(/translate\(\s*([\d.]+)\s*[,\s]\s*([\d.]+)\s*\)/); + if (m) { + translateX = parseFloat(m[1]); + translateY = parseFloat(m[2]); + } + } + + // Determine cell size from cursor rect or text elements (in SVG units) + var cursor = svg.querySelector('rect.gd-tp-cursor'); + var cellW, cellH; + if (cursor) { + cellW = parseFloat(cursor.getAttribute('width')) || 8.4; + cellH = parseFloat(cursor.getAttribute('height')) || 21; + } else { + var textEls = svg.querySelectorAll('.gd-tp-text'); + if (textEls.length < 2) return null; + var ys = [], xs = []; + for (var i = 0; i < Math.min(textEls.length, 50); i++) { + var y = parseFloat(textEls[i].getAttribute('y')); + var x = parseFloat(textEls[i].getAttribute('x')); + if (!isNaN(y) && ys.indexOf(y) < 0) ys.push(y); + if (!isNaN(x) && xs.indexOf(x) < 0) xs.push(x); + } + ys.sort(function(a, b) { return a - b; }); + xs.sort(function(a, b) { return a - b; }); + cellH = ys.length >= 2 ? ys[1] - ys[0] : 21; + cellW = xs.length >= 2 ? xs[1] - xs[0] : 8.4; + } + + return { + vbW: vbW, + vbH: vbH, + cellW: cellW, + cellH: cellH, + translateX: translateX, + translateY: translateY + }; + } + + function updateSnippets(layer, snippets, time, svgContainer) { + if (!snippets || snippets.length === 0) { + if (layer._cmdEls) { + for (var i = 0; i < layer._cmdEls.length; i++) { + layer._cmdEls[i].style.display = 'none'; + layer._cmdEls[i].style.opacity = '0'; + } + } + return; + } + + // Pre-create snippet copy buttons at init time + if (!layer._cmdEls) { + layer._cmdEls = []; + for (var j = 0; j < snippets.length; j++) { + var snip = snippets[j]; + var el = document.createElement('button'); + el.className = 'gd-tp-copy-snippet'; + el.setAttribute('type', 'button'); + el.setAttribute('aria-label', 'Copy snippet: ' + (snip.text || snip.match)); + el.dataset.text = snip.text; + el.dataset.match = snip.match || ''; + el.innerHTML = '' + + '' + (snip.label || 'Copy') + ''; + el.style.display = 'none'; + el.addEventListener('click', (function(btn, idx) { + return function(e) { + e.stopPropagation(); + var copyText = resolveSnippetText(snippets[idx], svgContainer); + if (copyText) { + navigator.clipboard.writeText(copyText).then(function() { + btn.classList.add('gd-tp-copied'); + setTimeout(function() { btn.classList.remove('gd-tp-copied'); }, 1500); + }); + } + }; + })(el, j)); + layer.appendChild(el); + layer._cmdEls.push(el); + } + } + + // Show only one snippet at a time (first active wins; overlaps are clipped) + var activeIdx = -1; + for (var k = 0; k < snippets.length; k++) { + var c = snippets[k]; + if (activeIdx < 0 && time >= c.time && time <= c.time + c.duration) { + activeIdx = k; + var elapsed = time - c.time; + var fadeIn = Math.min(1, elapsed / 0.3); + var fadeOut = Math.min(1, (c.duration - elapsed) / 0.3); + layer._cmdEls[k].style.display = 'inline-flex'; + layer._cmdEls[k].style.opacity = Math.min(fadeIn, fadeOut); + } else { + layer._cmdEls[k].style.display = 'none'; + layer._cmdEls[k].style.opacity = '0'; + } + } + } + + /** + * Resolve the text to copy for a snippet. + * If `match` is set, extract text from the SVG and run the regex. + * If regex has a capture group, use group(1); otherwise use group(0). + * Falls back to literal `text` field. + */ + function resolveSnippetText(snip, svgContainer) { + if (snip.match) { + var buffer = extractSvgText(svgContainer); + try { + var re = new RegExp(snip.match); + var m = re.exec(buffer); + if (m) return m[1] !== undefined ? m[1] : m[0]; + } catch (e) { /* invalid regex β€” fall through */ } + } + return snip.text || ''; + } + + /** + * Extract the plain-text content of the current SVG frame. + * Groups elements by y-coordinate to reconstruct terminal lines. + */ + function extractSvgText(svgContainer) { + var svg = svgContainer.querySelector('svg'); + if (!svg) return ''; + var textEls = svg.querySelectorAll('.gd-tp-text'); + if (!textEls.length) return ''; + // Group by y-coordinate (row) + var rows = {}; + for (var i = 0; i < textEls.length; i++) { + var el = textEls[i]; + var y = parseFloat(el.getAttribute('y')) || 0; + var x = parseFloat(el.getAttribute('x')) || 0; + var key = Math.round(y * 10); // quantize y to avoid float drift + if (!rows[key]) rows[key] = []; + rows[key].push({ x: x, text: el.textContent || '' }); + } + // Sort rows by y, spans within rows by x + var keys = Object.keys(rows).map(Number).sort(function(a, b) { return a - b; }); + var lines = []; + for (var k = 0; k < keys.length; k++) { + var spans = rows[keys[k]].sort(function(a, b) { return a.x - b.x; }); + var line = ''; + for (var s = 0; s < spans.length; s++) line += spans[s].text; + lines.push(line); + } + return lines.join('\n'); + } + + // --- Controls UI --- + + function buildControls() { + const root = document.createElement('div'); + root.className = 'gd-tp-controls'; + + const playBtn = document.createElement('button'); + playBtn.className = 'gd-tp-play-btn'; + playBtn.textContent = '\u25b6'; // β–Ά + playBtn.setAttribute('aria-label', 'Play'); + + const time = document.createElement('span'); + time.className = 'gd-tp-time'; + time.textContent = '0:00'; + + const timeline = document.createElement('div'); + timeline.className = 'gd-tp-timeline'; + timeline.setAttribute('role', 'slider'); + timeline.setAttribute('aria-label', 'Playback position'); + + const progress = document.createElement('div'); + progress.className = 'gd-tp-progress'; + timeline.appendChild(progress); + + const duration = document.createElement('span'); + duration.className = 'gd-tp-duration'; + duration.textContent = '0:00'; + + const speedBtn = document.createElement('button'); + speedBtn.className = 'gd-tp-speed-btn'; + speedBtn.textContent = '1\u00d7'; + speedBtn.setAttribute('aria-label', 'Playback speed'); + + root.appendChild(playBtn); + root.appendChild(time); + root.appendChild(timeline); + root.appendChild(duration); + root.appendChild(speedBtn); + + return { root, playBtn, time, timeline, progress, duration, speedBtn }; + } + + function renderChapterMarkers(timeline, manifest) { + if (!manifest.chapters || manifest.chapters.length === 0) return; + + for (const ch of manifest.chapters) { + if (ch.time > manifest.duration) continue; + const pct = manifest.duration > 0 ? (ch.time / manifest.duration) * 100 : 0; + const marker = document.createElement('div'); + marker.className = 'gd-tp-chapter-marker'; + marker.style.left = pct + '%'; + marker.setAttribute('title', ch.label || 'Chapter'); + marker.dataset.time = ch.time; + timeline.appendChild(marker); + } + } + + // --- Utilities --- + + function formatTime(seconds) { + const m = Math.floor(seconds / 60); + const s = Math.floor(seconds % 60); + return m + ':' + (s < 10 ? '0' : '') + s; + } + + // --- Initialization --- + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initAll); + } else { + initAll(); + } + + // Also handle Quarto's dynamic content loading + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + for (const node of mutation.addedNodes) { + if (node.nodeType === 1) { + if (node.classList && node.classList.contains(PLAYER_CLASS)) { + initPlayer(node); + } + const nested = node.querySelectorAll && node.querySelectorAll(`.${PLAYER_CLASS}`); + if (nested) nested.forEach((el) => initPlayer(el)); + } + } + } + }); + observer.observe(document.body, { childList: true, subtree: true }); +})(); diff --git a/docs/theme-init.js b/docs/theme-init.js new file mode 100644 index 0000000..344f2fa --- /dev/null +++ b/docs/theme-init.js @@ -0,0 +1,54 @@ +// Early theme initialization to prevent flash of wrong theme +(function() { + // When dark mode toggle is disabled, always use light mode + var dmMeta = document.querySelector('meta[name="gd-dark-mode"]'); + var darkModeDisabled = dmMeta && dmMeta.getAttribute('content') === 'disabled'; + + var stored = darkModeDisabled ? null : localStorage.getItem('great-docs-theme'); + var theme = stored || (darkModeDisabled ? 'light' : (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')); + var html = document.documentElement; + + // Hide body until theme is fully applied to prevent flash + html.classList.add('theme-loading'); + + if (theme === 'dark') { + html.classList.add('quarto-dark'); + html.setAttribute('data-bs-theme', 'dark'); + } else { + html.classList.add('quarto-light'); + html.setAttribute('data-bs-theme', 'light'); + } + + // Detect page type from URL for page-specific styling + var path = window.location.pathname; + var pageName = path.endsWith('/') || path.endsWith('/index.html') || path === '/' ? 'index' : null; + if (!pageName) { + var filename = path.split('/').pop().replace('.html', ''); + if (filename === 'index' || filename === '') { + pageName = 'index'; + } + } + + // Set page identifier on body when DOM is ready + function setPageIdentifier() { + if (pageName && document.body) { + document.body.setAttribute('data-page', pageName); + } + } + + // Reveal page once DOM is ready and styles are applied + function revealPage() { + setPageIdentifier(); + // Small delay to ensure CSS is processed + requestAnimationFrame(function() { + html.classList.remove('theme-loading'); + html.classList.add('theme-loaded'); + }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', revealPage); + } else { + revealPage(); + } +})(); diff --git a/docs/tooltips.js b/docs/tooltips.js new file mode 100644 index 0000000..f32122e --- /dev/null +++ b/docs/tooltips.js @@ -0,0 +1,344 @@ +/** + * Custom Tooltips for Great Docs + * + * Replaces native browser title tooltips with styled Tippy.js tooltips. + * + * Features: + * - Instant appearance (no 400ms delay) + * - Consistent styling across all browsers + * - Dark mode support + * - Smart positioning (avoids viewport edges) + * - Material Filling Effect animation + * - Converts existing title attributes site-wide + * + * NOTE: Quarto already bundles Popper.js and Tippy.js, so we use those instead + * of loading from CDN. Falls back to CDN if they're not available. + */ + +(function () { + "use strict"; + + // Configuration + var CONFIG = { + // Tippy.js CDN URLs (fallback if not bundled by Quarto) + popperUrl: "https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js", + tippyUrl: "https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js", + + // Default tooltip options + defaultOptions: { + animation: "shift-away", + duration: [200, 150], + delay: [0, 0], // Instant appearance + arrow: true, + placement: "top", + theme: "gd-material", + maxWidth: 300, + touch: ["hold", 500], // Long press on touch devices + // Smart positioning β€” flip if not enough space + popperOptions: { + modifiers: [ + { + name: "flip", + options: { + fallbackPlacements: ["bottom", "right", "left"], + }, + }, + { + name: "preventOverflow", + options: { + boundary: "viewport", + padding: 8, + }, + }, + ], + }, + }, + + // Selectors for elements to skip (already have custom tooltips) + skipSelectors: [ + "[data-tippy-content]", // Already has Tippy + ".tippy-box", // Tippy element itself + ".gd-tooltip-skip", // Explicit skip class + ], + }; + + // Track loaded state + var tippyReady = false; + var tippyInstance = null; + + /** + * Load an external script dynamically. + * @param {string} url - Script URL + * @returns {Promise} - Resolves when loaded + */ + function loadScript(url) { + return new Promise(function (resolve, reject) { + // Check if already loaded + var existing = document.querySelector('script[src="' + url + '"]'); + if (existing) { + resolve(); + return; + } + + var script = document.createElement("script"); + script.src = url; + script.async = true; + script.onload = resolve; + script.onerror = function () { + reject(new Error("Failed to load script: " + url)); + }; + document.head.appendChild(script); + }); + } + + /** + * Load Tippy.js and its dependencies. + * Quarto bundles Popper and Tippy, so check for them first. + * @returns {Promise} - Resolves when Tippy is ready + */ + function loadTippy() { + // If Tippy is already available (Quarto bundles it), use it directly + if (window.tippy) { + tippyReady = true; + return Promise.resolve(); + } + + // Quarto might have loaded tippy but not exposed it globally yet + // Wait a tick and check again + return new Promise(function (resolve) { + setTimeout(function () { + if (window.tippy) { + tippyReady = true; + resolve(); + return; + } + + // Fall back to CDN loading if Quarto's tippy isn't available + loadScript(CONFIG.popperUrl) + .then(function () { + return loadScript(CONFIG.tippyUrl); + }) + .then(function () { + tippyReady = true; + resolve(); + }) + .catch(function (err) { + console.warn("Failed to load Tippy.js from CDN:", err); + resolve(); // Continue without tooltips + }); + }, 50); + }); + } + + /** + * Determine if dark mode is active. + * @returns {boolean} + */ + function isDarkMode() { + return ( + document.documentElement.classList.contains("quarto-dark") || + document.body.classList.contains("quarto-dark") || + document.documentElement.getAttribute("data-bs-theme") === "dark" + ); + } + + /** + * Get theme name based on current mode. + * @returns {string} + */ + function getThemeName() { + return isDarkMode() ? "gd-material-dark" : "gd-material"; + } + + /** + * Convert title attributes to data-tippy-content. + * This prevents native tooltips from appearing. + */ + function convertTitleAttributes() { + var skipSelector = CONFIG.skipSelectors.join(", "); + + // Find all elements with title attributes + var elements = document.querySelectorAll("[title]"); + + elements.forEach(function (el) { + // Skip if matches any skip selector + if (skipSelector && el.matches(skipSelector)) { + return; + } + + var title = el.getAttribute("title"); + if (title && title.trim()) { + // Store the title as data-tippy-content + el.setAttribute("data-tippy-content", title); + // Remove the native title to prevent browser tooltip + el.removeAttribute("title"); + } + }); + } + + /** + * Initialize or reinitialize all tooltips. + */ + function initTooltips() { + if (!window.tippy) { + console.warn("Tippy.js not loaded"); + return; + } + + // First convert any title attributes + convertTitleAttributes(); + + // Find all elements with data-tippy-content + var elements = document.querySelectorAll("[data-tippy-content]"); + + if (elements.length === 0) { + return; + } + + // Create options with current theme + var options = Object.assign({}, CONFIG.defaultOptions, { + theme: getThemeName(), + allowHTML: true, + // Read content from data-tippy-content so HTML tags are rendered + content: function (el) { + return el.getAttribute("data-tippy-content") || ""; + }, + // Material filling effect via CSS + onMount: function (instance) { + instance.popper.classList.add("gd-tooltip-mounted"); + }, + onHidden: function (instance) { + instance.popper.classList.remove("gd-tooltip-mounted"); + }, + }); + + // Destroy existing instances to avoid duplicates + elements.forEach(function (el) { + if (el._tippy) { + el._tippy.destroy(); + } + }); + + // Initialize Tippy on all elements + tippyInstance = window.tippy(elements, options); + } + + /** + * Update tooltip themes when dark mode changes. + */ + function updateTooltipThemes() { + if (!tippyInstance) return; + + var newTheme = getThemeName(); + + // Update all active tippy instances + var instances = Array.isArray(tippyInstance) ? tippyInstance : [tippyInstance]; + instances.forEach(function (instance) { + if (instance && instance.setProps) { + instance.setProps({ theme: newTheme }); + } + }); + } + + /** + * Observe for dynamically added elements. + */ + function observeNewElements() { + if (!window.MutationObserver) return; + + var observer = new MutationObserver(function (mutations) { + var needsReinit = false; + + mutations.forEach(function (mutation) { + // Check added nodes for title or data-tippy-content attributes + mutation.addedNodes.forEach(function (node) { + if (node.nodeType === Node.ELEMENT_NODE) { + if (node.hasAttribute && (node.hasAttribute("title") || node.hasAttribute("data-tippy-content"))) { + needsReinit = true; + } + // Also check descendants + if (node.querySelectorAll) { + var withTitle = node.querySelectorAll("[title], [data-tippy-content]"); + if (withTitle.length > 0) { + needsReinit = true; + } + } + } + }); + + // Check for attribute changes (title or data-tippy-content being set) + if (mutation.type === "attributes" && + (mutation.attributeName === "title" || mutation.attributeName === "data-tippy-content")) { + needsReinit = true; + } + }); + + if (needsReinit) { + // Debounce re-initialization + clearTimeout(observeNewElements.timeout); + observeNewElements.timeout = setTimeout(initTooltips, 100); + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ["title", "data-tippy-content"], + }); + } + + /** + * Observe dark mode changes. + */ + function observeDarkMode() { + if (!window.MutationObserver) return; + + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + if (mutation.attributeName === "class" || mutation.attributeName === "data-bs-theme") { + updateTooltipThemes(); + } + }); + }); + + // Observe both html and body for class changes + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["class", "data-bs-theme"], + }); + observer.observe(document.body, { + attributes: true, + attributeFilter: ["class"], + }); + } + + /** + * Main initialization function. + */ + function init() { + loadTippy() + .then(function () { + initTooltips(); + observeNewElements(); + observeDarkMode(); + }) + .catch(function (err) { + console.error("Failed to initialize tooltips:", err); + }); + } + + // Initialize when DOM is ready + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } + + // Expose API for programmatic use + window.GDTooltips = { + init: init, + refresh: initTooltips, + updateTheme: updateTooltipThemes, + }; +})(); diff --git a/docs/video-embed.js b/docs/video-embed.js new file mode 100644 index 0000000..2e8a0dd --- /dev/null +++ b/docs/video-embed.js @@ -0,0 +1,72 @@ +/** + * Video embedding enhancements for Great Docs + * + * Improves performance and UX for embedded videos: + * - YouTube: uses the standard YouTube embedded player with native controls + * - Vimeo / other service iframes: IntersectionObserver lazy loading + * - Local
    __enter__()
    @@ -414,7 +427,7 @@

    Returns

    -
    +
    switch
    The switch instance itself (bind it with as s to register cases).
    @@ -430,13 +443,13 @@

    Usage

    -

    Source

    +

    Source

    __exit__(exc_type, exc_val, exc_tb)
    -
    -
    Raises
    +
    +
    Raises
    Exception
    @@ -455,7 +468,7 @@

    Usage

    -

    Source

    +

    Source

    __init__(value)
    @@ -464,7 +477,7 @@

    Parameters

    -
    value: typing.Any
    +
    value: Any
    The value each case key is compared against.
    @@ -476,11 +489,11 @@
    Parameters

    case()

    -

    Specify a case for the switch block:

    +

    Register a case for the switch block:

    Usage

    -

    Source

    +

    Source

    case(key, func, fallthrough=False)
    @@ -495,17 +508,17 @@

    Parameters

    -
    key: typing.Any
    +
    key: Any
    -

    Key for the case test (if this is a list or range, the items will each be added as a case)

    +

    Key for the case test. If this is a list or range, each item is added as a case for func.

    -
    func: typing.Callable[[], typing.Any]
    +
    func: Callable[[], Any]
    -

    Any callable taking no parameters to be executed if this case matches.

    +

    Any callable taking no parameters, executed if this case matches.

    -
    fallthrough: typing.Optional[bool] = False
    +
    fallthrough: bool | None = False
    -Optionally fall through to the subsequent case (defaults to False) +Optionally fall through to the subsequent case (defaults to False). None is reserved for internal use and leaves the fall-through state unchanged.
    @@ -514,9 +527,20 @@
    Parameters
    Returns
    -
    +
    bool
    +
    +True if this case (or any item of a list or range key) matched the switch value, otherwise False. +
    +
    +
    +
    +
    +
    Raises
    +
    +
    +
    ValueError
    -True if this case matched the switch value, otherwise None. +If the key is a duplicate, the key is an empty collection, or func is not callable.
    @@ -526,16 +550,17 @@
    Returns

    default()

    -

    Use as option final statement in switch block.

    +

    Register the default case: the action to run when no other case matches.

    Usage

    -

    Source

    +

    Source

    default(func)
    +

    Use it as the optional final statement in the switch block. Note that the ordering is not enforced: if default() is registered before a case that also matches, both will run. Always register it last.

        with switch(val) as s:
            s.case(...)
            s.case(...)
    @@ -545,9 +570,9 @@ 

    Parameters

    -
    func: typing.Callable[[], typing.Any]
    +
    func: Callable[[], Any]
    -Any callable taking no parameters to be executed if this (default) case matches. +Any callable taking no parameters, executed if no other case matched.
    @@ -556,7 +581,7 @@
    Parameters
    Returns
    -
    +
    None
    None
    diff --git a/docs/reference/switch.md b/docs/reference/switch.md index dffeb13..4909fc9 100644 --- a/docs/reference/switch.md +++ b/docs/reference/switch.md @@ -1,7 +1,7 @@ ## switch -switch is a module-level implementation of the switch statement for Python. +An explicit switch statement for Python, implemented as a context manager. Usage @@ -11,6 +11,8 @@ switch() ``` +Use it in a `with` block: register cases with [case()](switch.md#switchlang.switch.case) and [default()](switch.md#switchlang.switch.default), then read the matched case's return value from [result](switch.md#switchlang.switch.result). + See https://github.com/mikeckennedy/python-switch for full details. Copyright Michael Kennedy (https://mkennedy.codes) License: MIT @@ -18,7 +20,7 @@ See https://github.com/mikeckennedy/python-switch for full details. Copyright Mi | Name | Description | |----|----| -| [result](#result) | The value captured from the method called for a given case. | +| [result](#result) | The value returned by the function of the matched case. | ------------------------------------------------------------------------ @@ -26,11 +28,13 @@ See https://github.com/mikeckennedy/python-switch for full details. Copyright Mi #### result -The value captured from the method called for a given case. +The value returned by the function of the matched case. + +`result: Any` -`result` +When cases fall through, [result](switch.md#switchlang.switch.result) is the return value of the last function executed. value = 4 with switch(value) as s: @@ -40,6 +44,13 @@ The value captured from the method called for a given case. res = s.result # res == '1-to-5' +##### Raises + + +`Exception` +If accessed before the switch block has exited and computed a result. + + ## Methods | Name | Description | @@ -47,8 +58,8 @@ The value captured from the method called for a given case. | [__enter__()](#__enter__) | Enter the switch block. | | [__exit__()](#__exit__) | Run the matched case (and any fall-through cases) as the block exits. | | [__init__()](#__init__) | Create a new switch block that tests cases against `value`. | -| [case()](#case) | Specify a case for the switch block: | -| [default()](#default) | Use as option final statement in switch block. | +| [case()](#case) | Register a case for the switch block: | +| [default()](#default) | Register the default case: the action to run when no other case matches. | ------------------------------------------------------------------------ @@ -69,6 +80,7 @@ __enter__() ##### Returns +`switch` The switch instance itself (bind it with `as s` to register cases). @@ -114,7 +126,7 @@ __init__(value) ##### Parameters -`value: typing.Any` +`value: Any` The value each case key is compared against. @@ -124,7 +136,7 @@ The value each case key is compared against. #### case() -Specify a case for the switch block: +Register a case for the switch block: Usage @@ -143,20 +155,28 @@ case(key, func, fallthrough=False) ##### Parameters -`key: typing.Any` -Key for the case test (if this is a list or range, the items will each be added as a case) +`key: Any` +Key for the case test. If this is a list or range, each item is added as a case for `func`. -`func: typing.Callable[[], typing.Any]` -Any callable taking no parameters to be executed if this case matches. +`func: Callable[[], Any]` +Any callable taking no parameters, executed if this case matches. -`fallthrough: typing.Optional[bool] = ``False` -Optionally fall through to the subsequent case (defaults to False) +`fallthrough: bool | None = ``False` +Optionally fall through to the subsequent case (defaults to False). `None` is reserved for internal use and leaves the fall-through state unchanged. ##### Returns -True if this case matched the switch value, otherwise None. +`bool` +True if this case (or any item of a list or range key) matched the switch value, otherwise False. + + +##### Raises + + +`ValueError` +If the key is a duplicate, the key is an empty collection, or func is not callable. ------------------------------------------------------------------------ @@ -165,7 +185,7 @@ True if this case matched the switch value, otherwise None. #### default() -Use as option final statement in switch block. +Register the default case: the action to run when no other case matches. Usage @@ -175,6 +195,8 @@ default(func) ``` +Use it as the optional final statement in the switch block. Note that the ordering is not enforced: if [default()](switch.md#switchlang.switch.default) is registered before a case that also matches, both will run. Always register it last. + with switch(val) as s: s.case(...) s.case(...) @@ -184,11 +206,12 @@ default(func) ##### Parameters -`func: typing.Callable[[], typing.Any]` -Any callable taking no parameters to be executed if this (default) case matches. +`func: Callable[[], Any]` +Any callable taking no parameters, executed if no other case matched. ##### Returns +`None` None diff --git a/docs/search.json b/docs/search.json index eb86fdc..2cbc3b5 100644 --- a/docs/search.json +++ b/docs/search.json @@ -4,7 +4,7 @@ "href": "reference/switch.html", "title": "switch", "section": "", - "text": "switch is a module-level implementation of the switch statement for Python.", + "text": "An explicit switch statement for Python, implemented as a context manager.", "crumbs": [ "Reference", "The switch block", @@ -16,7 +16,7 @@ "href": "reference/switch.html#result", "title": "switch", "section": "result", - "text": "result\n\nThe value captured from the method called for a given case.\n\n\nresult\n\n\n value = 4\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n # ...\n\n res = s.result # res == '1-to-5'", + "text": "result\n\nThe value returned by the function of the matched case.\n\n\nresult: Any\n\n\nWhen cases fall through, result is the return value of the last function executed.\n value = 4\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n # ...\n\n res = s.result # res == '1-to-5'\n\n\nRaises\n\n\n Exception\n\nIf accessed before the switch block has exited and computed a result.", "crumbs": [ "Reference", "The switch block", @@ -28,7 +28,7 @@ "href": "reference/switch.html#enter__", "title": "switch", "section": "__enter__()", - "text": "__enter__()\n\nEnter the switch block.\n\n\nUsage\nSource\n\n\n__enter__()\n\n\nReturns\n\n\n\n\nThe switch instance itself (bind it with as s to register cases).", + "text": "__enter__()\n\nEnter the switch block.\n\n\nUsage\nSource\n\n\n__enter__()\n\n\nReturns\n\n\n switch\n\nThe switch instance itself (bind it with as s to register cases).", "crumbs": [ "Reference", "The switch block", @@ -52,7 +52,7 @@ "href": "reference/switch.html#init__", "title": "switch", "section": "__init__()", - "text": "__init__()\n\nCreate a new switch block that tests cases against value.\n\n\nUsage\nSource\n\n\n__init__(value)\n\n\nParameters\n\n\nvalue: typing.Any\n\nThe value each case key is compared against.", + "text": "__init__()\n\nCreate a new switch block that tests cases against value.\n\n\nUsage\nSource\n\n\n__init__(value)\n\n\nParameters\n\n\nvalue: Any\n\nThe value each case key is compared against.", "crumbs": [ "Reference", "The switch block", @@ -64,7 +64,7 @@ "href": "reference/switch.html#case", "title": "switch", "section": "case()", - "text": "case()\n\nSpecify a case for the switch block:\n\n\nUsage\nSource\n\n\ncase(key, func, fallthrough=False)\n\n\n with switch(val) as s:\n s.case('a', function)\n s.case('b', function, fallthrough=True)\n s.default(function)\n\n\nParameters\n\n\nkey: typing.Any\n\nKey for the case test (if this is a list or range, the items will each be added as a case)\n\nfunc: typing.Callable[[], typing.Any]\n\nAny callable taking no parameters to be executed if this case matches.\n\nfallthrough: typing.Optional[bool] = False\n\nOptionally fall through to the subsequent case (defaults to False)\n\n\n\n\n\nReturns\n\n\n\n\nTrue if this case matched the switch value, otherwise None.", + "text": "case()\n\nRegister a case for the switch block:\n\n\nUsage\nSource\n\n\ncase(key, func, fallthrough=False)\n\n\n with switch(val) as s:\n s.case('a', function)\n s.case('b', function, fallthrough=True)\n s.default(function)\n\n\nParameters\n\n\nkey: Any\n\nKey for the case test. If this is a list or range, each item is added as a case for func.\n\nfunc: Callable[[], Any]\n\nAny callable taking no parameters, executed if this case matches.\n\nfallthrough: bool | None = False\n\nOptionally fall through to the subsequent case (defaults to False). None is reserved for internal use and leaves the fall-through state unchanged.\n\n\n\n\n\nReturns\n\n\n bool\n\nTrue if this case (or any item of a list or range key) matched the switch value, otherwise False.\n\n\n\n\n\nRaises\n\n\n ValueError\n\nIf the key is a duplicate, the key is an empty collection, or func is not callable.", "crumbs": [ "Reference", "The switch block", @@ -76,7 +76,7 @@ "href": "reference/switch.html#default", "title": "switch", "section": "default()", - "text": "default()\n\nUse as option final statement in switch block.\n\n\nUsage\nSource\n\n\ndefault(func)\n\n\n with switch(val) as s:\n s.case(...)\n s.case(...)\n s.default(function)\n\n\nParameters\n\n\nfunc: typing.Callable[[], typing.Any]\n\nAny callable taking no parameters to be executed if this (default) case matches.\n\n\n\n\n\nReturns\n\n\n\n\nNone", + "text": "default()\n\nRegister the default case: the action to run when no other case matches.\n\n\nUsage\nSource\n\n\ndefault(func)\n\n\nUse it as the optional final statement in the switch block. Note that the ordering is not enforced: if default() is registered before a case that also matches, both will run. Always register it last.\n with switch(val) as s:\n s.case(...)\n s.case(...)\n s.default(function)\n\n\nParameters\n\n\nfunc: Callable[[], Any]\n\nAny callable taking no parameters, executed if no other case matched.\n\n\n\n\n\nReturns\n\n\n None\n\nNone", "crumbs": [ "Reference", "The switch block", @@ -88,7 +88,7 @@ "href": "reference/closed_range.html", "title": "closed_range()", "section": "", - "text": "Creates a closed range that allows you to specify a case\n\n\nUsage\nSource\n\n\nclosed_range(start, stop, step=1)\n\n\nfrom [start, stop] inclusively.\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n s.case(closed_range(6, 7), lambda: \"6\")\n s.default(lambda: 'default')\n\n\nParameters\n\n\nstart: int\n\nThe inclusive lower bound of the range [start, stop].\n\nstop: int\n\nThe inclusive upper bound of the range [start, stop].\n\nstep=1\n\nThe step size between elements (defaults to 1).\n\n\n\n\n\nReturns\n\n\n range\n\nA range() generator that has a closed upper bound.", + "text": "Create a closed range for a case: both start and stop are included.\n\n\nUsage\nSource\n\n\nclosed_range(start, stop, step=1)\n\n\nWith the default step of 1, closed_range(1, 5) covers 1, 2, 3, 4, 5 β€” unlike range(1, 5), the upper bound is part of the range.\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n s.case(closed_range(6, 7), lambda: \"6-or-7\")\n s.default(lambda: 'default')\n\n\nParameters\n\n\nstart: int\n\nThe inclusive lower bound of the range.\n\nstop: int\n\nThe inclusive upper bound of the range.\n\nstep: int = 1\n\nThe step size between elements (defaults to 1).\n\n\n\n\n\nReturns\n\n\n range\n\nA range object with a closed (inclusive) upper bound.\n\n\n\n\n\nRaises\n\n\n ValueError\n\nIf start is not less than stop.", "crumbs": [ "Reference", "Range helpers", @@ -100,7 +100,7 @@ "href": "skills.html", "title": "Skills", "section": "", - "text": "A skill is a package of structured files that teaches an AI coding agent how to work with a specific tool or framework. The skill below was generated by Great Docs from this project’s documentation. Install it in your agent and it will be able to run commands, edit configuration, write content, and troubleshoot problems without step-by-step guidance from you.\n\n \n β–Ά Install this skill\n \n \n \n \nAny agent β€” install with npx:\nnpx skills add https://mkennedy.codes/docs/python-switch/\nCodex / OpenCode\nTell the agent:Fetch the skill file at https://mkennedy.codes/docs/python-switch/skill.md and follow the instructions.\nManual β€” download the skill file:\ncurl -O https://mkennedy.codes/docs/python-switch/skill.md\nOr browse the SKILL.md file.\n \n \n \n\n\nSKILL.md\n---\nname: switchlang\ndescription: >\n Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package.\nlicense: MIT\ncompatibility: Requires Python >=3.9.\n---\n\n# switchlang\n\nAdds switch blocks to the Python language.\n\n## Installation\n\n```bash\npip install switchlang\n```\n\n## API overview\n\n### The switch block\n\nThe context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`.\n\n\n- `switch`: switch is a module-level implementation of the switch statement for Python\n\n### Range helpers\n\nHelpers for mapping ranges of values to a single case.\n\n\n- `closed_range`: Creates a closed range that allows you to specify a case\n\n## Resources\n\n- [Full documentation](https://mkennedy.codes/docs/python-switch/)\n- [llms.txt](llms.txt) β€” Indexed API reference for LLMs\n- [llms-full.txt](llms-full.txt) β€” Comprehensive documentation for LLMs\n- [Source code](https://github.com/mikeckennedy/python-switch)" + "text": "A skill is a package of structured files that teaches an AI coding agent how to work with a specific tool or framework. The skill below was generated by Great Docs from this project’s documentation. Install it in your agent and it will be able to run commands, edit configuration, write content, and troubleshoot problems without step-by-step guidance from you.\n\n \n β–Ά Install this skill\n \n \n \n \nAny agent β€” install with npx:\nnpx skills add https://mkennedy.codes/docs/python-switch/\nCodex / OpenCode\nTell the agent:Fetch the skill file at https://mkennedy.codes/docs/python-switch/skill.md and follow the instructions.\nManual β€” download the skill file:\ncurl -O https://mkennedy.codes/docs/python-switch/skill.md\nOr browse the SKILL.md file.\n \n \n \n\n\nSKILL.md\n---\nname: switchlang\ndescription: >\n Adds switch blocks to the Python language. Use when writing Python code that uses the switchlang package.\nlicense: MIT\ncompatibility: Requires Python >=3.9.\n---\n\n# switchlang\n\nAdds switch blocks to the Python language.\n\n## Installation\n\n```bash\npip install switchlang\n```\n\n## API overview\n\n### The switch block\n\nThe context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`.\n\n\n- `switch`: An explicit switch statement for Python, implemented as a context manager\n\n### Range helpers\n\nHelpers for mapping ranges of values to a single case.\n\n\n- `closed_range`: Create a closed range for a case: both `start` and `stop` are included\n\n## Resources\n\n- [Full documentation](https://mkennedy.codes/docs/python-switch/)\n- [llms.txt](llms.txt) β€” Indexed API reference for LLMs\n- [llms-full.txt](llms-full.txt) β€” Comprehensive documentation for LLMs\n- [Source code](https://github.com/mikeckennedy/python-switch)" }, { "objectID": "changelog.html", @@ -121,21 +121,21 @@ "href": "index.html#example", "title": "switchlang", "section": "Example", - "text": "Example\nfrom switchlang import switch\n\ndef main():\n num = 7\n val = input(\"Enter a character, a, b, c or any other: \")\n\n with switch(val) as s:\n s.case('a', process_a)\n s.case('b', lambda: process_with_data(val, num, 'other values still'))\n s.default(process_any)\n \ndef process_a():\n print(\"Found A!\")\n \ndef process_any():\n print(\"Found Default!\")\n \ndef process_with_data(*value):\n print(\"Found with data: {}\".format(value))\n\nmain()" + "text": "Example\nfrom switchlang import switch\n\ndef main():\n num = 7\n val = input(\"Enter a character, a, b, c or any other: \")\n\n with switch(val) as s:\n s.case('a', process_a)\n s.case('b', lambda: process_with_data(val, num, 'other values still'))\n s.default(process_any)\n\ndef process_a():\n print(\"Found A!\")\n\ndef process_any():\n print(\"Found Default!\")\n\ndef process_with_data(*value):\n print(f\"Found with data: {value}\")\n\nmain()" }, { "objectID": "index.html#installation", "href": "index.html#installation", "title": "switchlang", "section": "Installation", - "text": "Installation\nSimply install via pip:\npip install switchlang" + "text": "Installation\nSimply install via pip or uv:\npip install switchlang\n## or\nuv add switchlang" }, { "objectID": "index.html#features", "href": "index.html#features", "title": "switchlang", "section": "Features", - "text": "Features\n\nMore explicit than using dictionaries with functions as values.\nVerifies the signatures of the methods\nSupports default case\nChecks for duplicate keys / cases\nKeys can be anything hashable (numbers, strings, objects, etc.)\nSupports β€œfall-through” cases (opt-in with fallthrough=True)\nUse range and list for multiple cases mapped to a single action" + "text": "Features\n\nMore explicit than using dictionaries with functions as values.\nValidates that case actions are callable\nSupports default case\nChecks for duplicate keys / cases\nKeys can be anything hashable (numbers, strings, objects, etc.)\nCapture the return value of the matched case with s.result\nSupports β€œfall-through” cases (opt-in with fallthrough=True)\nUse range and list for multiple cases mapped to a single action" }, { "objectID": "index.html#multiple-cases-one-action", @@ -149,21 +149,35 @@ "href": "index.html#closed-vs.-open-ranges", "title": "switchlang", "section": "Closed vs.Β Open ranges", - "text": "Closed vs.Β Open ranges\nLooking at the above code it’s a bit weird that 6 appears at the end of one case, beginning of the next. But range() is half open/closed.\nTo handle the inclusive case, I’ve added closed_range(start, stop). For example, closed_range(1,5) -> [1,2,3,4,5]" + "text": "Closed vs.Β Open ranges\nLooking at the above code it’s a bit weird that 6 appears at the end of one case, beginning of the next. But range() is half open/closed.\nTo handle the inclusive case, I’ve added closed_range(start, stop). For example, closed_range(1, 5) -> [1, 2, 3, 4, 5]:\nfrom switchlang import switch, closed_range\n\nwith switch(value) as s:\n s.case(closed_range(1, 5), lambda: 'one to five') # matches 1, 2, 3, 4, 5\n s.case(closed_range(6, 9), lambda: 'six to nine') # matches 6, 7, 8, 9\n s.default(lambda: 'something else')" + }, + { + "objectID": "index.html#fall-through-and-results", + "href": "index.html#fall-through-and-results", + "title": "switchlang", + "section": "Fall-through and results", + "text": "Fall-through and results\nCases don’t fall through by default. Opt in per case with fallthrough=True and the next case runs too, whether or not its key matches:\nvalue = 2\n\nwith switch(value) as s:\n s.case(1, lambda: 'one')\n s.case(2, lambda: 'two', fallthrough=True)\n s.case(3, lambda: 'three') # runs as well, then stops here\n s.default(lambda: 'other')\n\nprint(s.result) # 'three'\nWhatever the executed case’s function returns is available after the block as s.result. When cases fall through, the last function executed wins." }, { "objectID": "index.html#why-not-just-raw-dict", "href": "index.html#why-not-just-raw-dict", "title": "switchlang", "section": "Why not just raw dict?", - "text": "Why not just raw dict?\nThe biggest push back on this idea is that we already have this problem solved. You write the following code.\nswitch = {\n 1: method_on_one,\n 2: method_on_two,\n 3: method_three\n}\n\nresult = switch.get(value, default_method_to_run)()\nThis works but is very low on the functionality level. We have a better solution here I believe. Let’s take this example and see how it looks in python-switch vs raw dicts:\n## with python-switch:\n\nwhile True:\n action = get_action(action)\n\n with switch(action) as s:\n s.case(['c', 'a'], create_account)\n s.case('l', log_into_account)\n s.case('r', register_cage)\n s.case('u', update_availability)\n s.case(['v', 'b'], view_bookings)\n s.case('x', exit_app)\n s.case('', lambda: None)\n s.case(range(1,6), lambda: set_level(action))\n s.default(unknown_command)\n \n print('Result is {}'.format(s.result))\nNow compare that to the espoused pythonic way:\n## with raw dicts\n\nwhile True:\n action = get_action(action)\n\n switch = {\n 'c': create_account,\n 'a': create_account,\n 'l': log_into_account,\n 'r': register_cage,\n 'u': update_availability,\n 'v': view_bookings,\n 'b': view_bookings,\n 'x': exit_app,\n 1: lambda: set_level(action),\n 2: lambda: set_level(action),\n 3: lambda: set_level(action),\n 4: lambda: set_level(action),\n 5: lambda: set_level(action),\n '': lambda: None,\n }\n result = switch.get(action, unknown_command)()\n print('Result is {}'.format(result))\nPersonally, I much prefer to read and write the one above. That’s why I wrote this module. It seems to convey the intent of switch way more than the dict. But either are options." + "text": "Why not just raw dict?\nThe biggest push back on this idea is that we already have this problem solved. You write the following code.\nswitch = {\n 1: method_on_one,\n 2: method_on_two,\n 3: method_three\n}\n\nresult = switch.get(value, default_method_to_run)()\nThis works but is very low on the functionality level. We have a better solution here I believe. Let’s take this example and see how it looks in python-switch vs raw dicts:\n## with python-switch:\n\nwhile True:\n action = get_action(action)\n\n with switch(action) as s:\n s.case(['c', 'a'], create_account)\n s.case('l', log_into_account)\n s.case('r', register_cage)\n s.case('u', update_availability)\n s.case(['v', 'b'], view_bookings)\n s.case('x', exit_app)\n s.case('', lambda: None)\n s.case(range(1, 6), lambda: set_level(action))\n s.default(unknown_command)\n\n print(f'Result is {s.result}')\nNow compare that to the espoused pythonic way:\n## with raw dicts\n\nwhile True:\n action = get_action(action)\n\n switch = {\n 'c': create_account,\n 'a': create_account,\n 'l': log_into_account,\n 'r': register_cage,\n 'u': update_availability,\n 'v': view_bookings,\n 'b': view_bookings,\n 'x': exit_app,\n 1: lambda: set_level(action),\n 2: lambda: set_level(action),\n 3: lambda: set_level(action),\n 4: lambda: set_level(action),\n 5: lambda: set_level(action),\n '': lambda: None,\n }\n result = switch.get(action, unknown_command)()\n print(f'Result is {result}')\nPersonally, I much prefer to read and write the one above. That’s why I wrote this module. It seems to convey the intent of switch way more than the dict. But both are options." }, { "objectID": "index.html#why-not-just-if-elif-else", "href": "index.html#why-not-just-if-elif-else", "title": "switchlang", "section": "Why not just if / elif / else?", - "text": "Why not just if / elif / else?\nAnother push back on this idea is that we already have this problem solved. Switch statements are really if / elif / else blocks. So you write the following code.\n## with if / elif / else\n\nwhile True:\n action = get_action(action)\n\n if action == 'c' or action == 'a':\n result = create_account()\n elif action == 'l':\n result = log_into_account()\n elif action == 'r':\n result = register_cage()\n elif action == 'a':\n result = update_availability()\n elif action == 'v' or action == 'b':\n result = view_bookings()\n elif action == 'x':\n result = exit_app()\n elif action in {1, 2, 3, 4, 5}:\n result = set_level(action)\n else:\n unknown_command()\n \n print('Result is {}'.format(result))\nI actually believe this is a little better than the raw dict option. But there are still things that are harder.\n\nHow would you deal with fall-through cleanly?\nDid you notice the bug? We forgot to set result in default case (else) and will result in a runtime error (but only if that case hits).\nThere is another bug. update_availability will never run because its command (a) is bound to two cases. This is guarded against in switch and you would receive a duplicate case error the first time it runs at all.\nWhile it’s pretty clear, it’s much more verbose and less declarative than the switch version.\n\nAgain, compare the if / elif / else to what you have with switch. This code is identical except doesn’t have the default case bug.\nwhile True:\n action = get_action(action)\n\n with switch(action) as s:\n s.case(['c', 'a'], create_account)\n s.case('l', log_into_account)\n s.case('r', register_cage)\n s.case('u', update_availability)\n s.case(['v', 'b'], view_bookings)\n s.case('x', exit_app)\n s.case('', lambda: None)\n s.case(range(1,6), lambda: set_level(action))\n s.default(unknown_command)\n \n print('Result is {}'.format(s.result))" + "text": "Why not just if / elif / else?\nAnother push back on this idea is that we already have this problem solved. Switch statements are really if / elif / else blocks. So you write the following code.\n## with if / elif / else\n\nwhile True:\n action = get_action(action)\n\n if action == 'c' or action == 'a':\n result = create_account()\n elif action == 'l':\n result = log_into_account()\n elif action == 'r':\n result = register_cage()\n elif action == 'a':\n result = update_availability()\n elif action == 'v' or action == 'b':\n result = view_bookings()\n elif action == 'x':\n result = exit_app()\n elif action in {1, 2, 3, 4, 5}:\n result = set_level(action)\n else:\n unknown_command()\n\n print(f'Result is {result}')\nI actually believe this is a little better than the raw dict option. But there are still things that are harder.\n\nHow would you deal with fall-through cleanly?\nDid you notice the bug? We forgot to set result in default case (else) and will result in a runtime error (but only if that case hits).\nThere is another bug. update_availability will never run because its command (a) is bound to two cases. This is guarded against in switch and you would receive a duplicate case error the first time it runs at all.\nWhile it’s pretty clear, it’s much more verbose and less declarative than the switch version.\n\nAgain, compare the if / elif / else to what you have with switch. This code is identical except doesn’t have the default case bug.\nwhile True:\n action = get_action(action)\n\n with switch(action) as s:\n s.case(['c', 'a'], create_account)\n s.case('l', log_into_account)\n s.case('r', register_cage)\n s.case('u', update_availability)\n s.case(['v', 'b'], view_bookings)\n s.case('x', exit_app)\n s.case('', lambda: None)\n s.case(range(1, 6), lambda: set_level(action))\n s.default(unknown_command)\n\n print(f'Result is {s.result}')" + }, + { + "objectID": "index.html#why-not-just-match", + "href": "index.html#why-not-just-match", + "title": "switchlang", + "section": "Why not just match?", + "text": "Why not just match?\nPython 3.10 added structural pattern matching, and it’s genuinely great at what it was built for: destructuring data by shape (tuples, dataclasses, nested structures, and so on). But it covers different ground than a classic switch statement:\n\nNo fall-through. match arms are exclusive. With switchlang, fall-through is opt-in per case with fallthrough=True.\nCases are fixed syntax. You can’t build match arms from data at runtime, while s.case(some_list, action) and s.case(closed_range(1, 5), action) are plain method calls. Also watch out: a bare name in a case pattern captures the value rather than comparing against a constant β€” a classic match gotcha that can’t happen here.\nNo result capture. match arms are blocks of statements. switchlang dispatches to callables and hands back the chosen case’s return value as s.result.\nPython version. match needs Python 3.10+, while switchlang supports 3.9+.\n\nIf you’re pattern-matching on the shape of objects, use match β€” that’s what it’s for. If you want explicit value-based dispatch with fall-through, ranges, and a captured result, that’s switchlang." }, { "objectID": "skill.html", @@ -177,14 +191,14 @@ "href": "skill.html#the-switch-block", "title": "switchlang", "section": "The switch block", - "text": "The switch block\nThe context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.\n\nswitch: switch is a module-level implementation of the switch statement for Python" + "text": "The switch block\nThe context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.\n\nswitch: An explicit switch statement for Python, implemented as a context manager" }, { "objectID": "skill.html#range-helpers", "href": "skill.html#range-helpers", "title": "switchlang", "section": "Range helpers", - "text": "Range helpers\nHelpers for mapping ranges of values to a single case.\n\nclosed_range: Creates a closed range that allows you to specify a case" + "text": "Range helpers\nHelpers for mapping ranges of values to a single case.\n\nclosed_range: Create a closed range for a case: both start and stop are included" }, { "objectID": "license.html", @@ -198,7 +212,7 @@ "href": "reference/index.html", "title": "Reference", "section": "", - "text": "The switch block\n\nThe context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.\n\n\nswitch\n\nswitch is a module-level implementation of the switch statement for Python.\n\n\n\n\nRange helpers\n\nHelpers for mapping ranges of values to a single case.\n\n\nclosed_range()\n\nCreates a closed range that allows you to specify a case", + "text": "The switch block\n\nThe context manager that gives Python an explicit switch statement. Use it in a with block, register cases, then read result.\n\n\nswitch\n\nAn explicit switch statement for Python, implemented as a context manager.\n\n\n\n\nRange helpers\n\nHelpers for mapping ranges of values to a single case.\n\n\nclosed_range()\n\nCreate a closed range for a case: both start and stop are included.", "crumbs": [ "Reference", "API Index" diff --git a/docs/skill.md b/docs/skill.md index 194f161..300f422 100644 --- a/docs/skill.md +++ b/docs/skill.md @@ -23,14 +23,14 @@ pip install switchlang The context manager that gives Python an explicit switch statement. Use it in a `with` block, register cases, then read `result`. -- `switch`: switch is a module-level implementation of the switch statement for Python +- `switch`: An explicit switch statement for Python, implemented as a context manager ### Range helpers Helpers for mapping ranges of values to a single case. -- `closed_range`: Creates a closed range that allows you to specify a case +- `closed_range`: Create a closed range for a case: both `start` and `stop` are included ## Resources diff --git a/docs/skills.html b/docs/skills.html index ac094be..17a36db 100644 --- a/docs/skills.html +++ b/docs/skills.html @@ -130,7 +130,7 @@
    closed_range(
    @@ -291,7 +292,7 @@ 

    -

    With the default step of 1, closed_range(1, 5) covers 1, 2, 3, 4, 5 β€” unlike range(1, 5), the upper bound is part of the range.

    +

    With the default step of 1, closed_range(1, 5) covers 1, 2, 3, 4, 5 β€” unlike range(1, 5), the upper bound is part of the range. With a larger step the range never goes past stop: closed_range(1, 6, 2) covers 1, 3, 5, and stop itself is included when the step lands on it exactly, as in closed_range(1, 7, 2) -> 1, 3, 5, 7.

        with switch(value) as s:
             s.case(closed_range(1, 5), lambda: "1-to-5")
             s.case(closed_range(6, 7), lambda: "6-or-7")
    @@ -311,7 +312,7 @@ 

    Parameters

    step: int = 1
    -The step size between elements (defaults to 1). +The step size between elements; must be 1 or greater (defaults to 1).

    @@ -333,7 +334,7 @@

    Raises

    ValueError
    -If start is not less than stop. +If start is not less than stop, or step is less than 1.
    diff --git a/docs/reference/closed_range.md b/docs/reference/closed_range.md index 899c2c5..8c25753 100644 --- a/docs/reference/closed_range.md +++ b/docs/reference/closed_range.md @@ -15,7 +15,7 @@ closed_range( ``` -With the default step of 1, `closed_range(1, 5)` covers 1, 2, 3, 4, 5 -- unlike `range(1, 5)`, the upper bound is part of the range. +With the default step of 1, `closed_range(1, 5)` covers 1, 2, 3, 4, 5 -- unlike `range(1, 5)`, the upper bound is part of the range. With a larger step the range never goes past `stop`: `closed_range(1, 6, 2)` covers 1, 3, 5, and `stop` itself is included when the step lands on it exactly, as in `closed_range(1, 7, 2)` -\> 1, 3, 5, 7. with switch(value) as s: s.case(closed_range(1, 5), lambda: "1-to-5") @@ -33,7 +33,7 @@ The inclusive lower bound of the range. The inclusive upper bound of the range. `step: int = ``1` -The step size between elements (defaults to 1). +The step size between elements; must be 1 or greater (defaults to 1). ## Returns @@ -47,4 +47,4 @@ A range object with a closed (inclusive) upper bound. `ValueError` -If start is not less than stop. +If start is not less than stop, or step is less than 1. diff --git a/docs/reference/index.html b/docs/reference/index.html index 6e96273..1ada3e0 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -70,6 +70,7 @@ "search-label": "Search" } } + diff --git a/docs/reference/switch.html b/docs/reference/switch.html index 3d8f932..a8ed99c 100644 --- a/docs/reference/switch.html +++ b/docs/reference/switch.html @@ -105,6 +105,7 @@ "search-label": "Search" } } + @@ -290,7 +291,7 @@

    Usage

    -

    Source

    +

    Source

    switch()
    diff --git a/docs/search.json b/docs/search.json index 2cbc3b5..ab2474e 100644 --- a/docs/search.json +++ b/docs/search.json @@ -88,7 +88,7 @@ "href": "reference/closed_range.html", "title": "closed_range()", "section": "", - "text": "Create a closed range for a case: both start and stop are included.\n\n\nUsage\nSource\n\n\nclosed_range(start, stop, step=1)\n\n\nWith the default step of 1, closed_range(1, 5) covers 1, 2, 3, 4, 5 β€” unlike range(1, 5), the upper bound is part of the range.\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n s.case(closed_range(6, 7), lambda: \"6-or-7\")\n s.default(lambda: 'default')\n\n\nParameters\n\n\nstart: int\n\nThe inclusive lower bound of the range.\n\nstop: int\n\nThe inclusive upper bound of the range.\n\nstep: int = 1\n\nThe step size between elements (defaults to 1).\n\n\n\n\n\nReturns\n\n\n range\n\nA range object with a closed (inclusive) upper bound.\n\n\n\n\n\nRaises\n\n\n ValueError\n\nIf start is not less than stop.", + "text": "Create a closed range for a case: both start and stop are included.\n\n\nUsage\nSource\n\n\nclosed_range(start, stop, step=1)\n\n\nWith the default step of 1, closed_range(1, 5) covers 1, 2, 3, 4, 5 β€” unlike range(1, 5), the upper bound is part of the range. With a larger step the range never goes past stop: closed_range(1, 6, 2) covers 1, 3, 5, and stop itself is included when the step lands on it exactly, as in closed_range(1, 7, 2) -> 1, 3, 5, 7.\n with switch(value) as s:\n s.case(closed_range(1, 5), lambda: \"1-to-5\")\n s.case(closed_range(6, 7), lambda: \"6-or-7\")\n s.default(lambda: 'default')\n\n\nParameters\n\n\nstart: int\n\nThe inclusive lower bound of the range.\n\nstop: int\n\nThe inclusive upper bound of the range.\n\nstep: int = 1\n\nThe step size between elements; must be 1 or greater (defaults to 1).\n\n\n\n\n\nReturns\n\n\n range\n\nA range object with a closed (inclusive) upper bound.\n\n\n\n\n\nRaises\n\n\n ValueError\n\nIf start is not less than stop, or step is less than 1.", "crumbs": [ "Reference", "Range helpers", diff --git a/docs/skills.html b/docs/skills.html index 17a36db..4c0da4b 100644 --- a/docs/skills.html +++ b/docs/skills.html @@ -105,6 +105,7 @@ "search-label": "Search" } } + diff --git a/great-docs.yml b/great-docs.yml index d3124b8..860e864 100644 --- a/great-docs.yml +++ b/great-docs.yml @@ -39,6 +39,12 @@ pypi: true mcp: enabled: false +# Umami analytics β€” merged into Quarto's format.html.include-in-header, so it lands in +# the of every generated page. +include_in_header: + - text: | + + # Author metadata for display in the landing page sidebar authors: - name: Michael Kennedy diff --git a/switchlang/__switchlang_impl.py b/switchlang/__switchlang_impl.py index 09cbc2b..a94aaad 100644 --- a/switchlang/__switchlang_impl.py +++ b/switchlang/__switchlang_impl.py @@ -165,7 +165,9 @@ def result(self) -> Any: :return: The value returned by the matched case's function (the last one executed when falling through). :raises Exception: If accessed before the switch block has exited and computed a result. """ - if self.__result == switch.__no_result: + # Identity, not equality: a result with a permissive __eq__ (e.g. a numpy + # array) must not be mistaken for the no-result sentinel. + if self.__result is switch.__no_result: raise Exception('No result has been computed (did you access switch.result inside the with block?)') return self.__result @@ -176,7 +178,10 @@ def closed_range(start: int, stop: int, step: int = 1) -> range: Create a closed range for a case: both `start` and `stop` are included. With the default step of 1, `closed_range(1, 5)` covers 1, 2, 3, 4, 5 β€” - unlike `range(1, 5)`, the upper bound is part of the range. + unlike `range(1, 5)`, the upper bound is part of the range. With a larger + step the range never goes past `stop`: `closed_range(1, 6, 2)` covers + 1, 3, 5, and `stop` itself is included when the step lands on it exactly, + as in `closed_range(1, 7, 2)` -> 1, 3, 5, 7. ``` with switch(value) as s: @@ -187,11 +192,13 @@ def closed_range(start: int, stop: int, step: int = 1) -> range: :param start: The inclusive lower bound of the range. :param stop: The inclusive upper bound of the range. - :param step: The step size between elements (defaults to 1). + :param step: The step size between elements; must be 1 or greater (defaults to 1). :return: A range object with a closed (inclusive) upper bound. - :raises ValueError: If start is not less than stop. + :raises ValueError: If start is not less than stop, or step is less than 1. """ if start >= stop: raise ValueError('Start must be less than stop.') + if step < 1: + raise ValueError('Step must be 1 or greater.') - return range(start, stop + step, step) + return range(start, stop + 1, step) diff --git a/tests/test_core.py b/tests/test_core.py index 1ae7fbf..bfb5c98 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -108,6 +108,22 @@ def test_result_inaccessible_if_hasnt_run(self): s = switch(7) s.result + def test_result_holding_always_equal_object(self): + # a result that compares equal to everything (numpy arrays are the + # real-world case) must not be mistaken for the no-result sentinel + class AlwaysEqual: + def __eq__(self, other): + return True + + def __hash__(self): + return 0 + + obj = AlwaysEqual() + with switch('x') as s: + s.case('x', lambda: obj) + + self.assertIs(s.result, obj) + def test_closed_range(self): for value in [1, 2, 3, 4, 5]: with switch(value) as s: @@ -131,6 +147,28 @@ def test_closed_range(self): self.assertEqual(s.result, '6') + def test_closed_range_with_step(self): + self.assertEqual(list(closed_range(1, 5)), [1, 2, 3, 4, 5]) + # the range must never overshoot stop (it used to, by step - 1) + self.assertEqual(list(closed_range(1, 6, 2)), [1, 3, 5]) + self.assertEqual(list(closed_range(1, 10, 4)), [1, 5, 9]) + # stop is included when the step lands on it exactly + self.assertEqual(list(closed_range(1, 7, 2)), [1, 3, 5, 7]) + + # 7 lies outside [1, 6], so it must hit the default case + with switch(7) as s: + s.case(closed_range(1, 6, 2), lambda: '1-to-6 odds') + s.default(lambda: 'default') + + self.assertEqual(s.result, 'default') + + def test_closed_range_invalid_step(self): + with self.assertRaises(ValueError): + closed_range(1, 10, 0) + + with self.assertRaises(ValueError): + closed_range(1, 10, -2) + def test_fallthrough_simple(self): visited = [] value = 2 From 042728d4dc4b3ddb6bdf080650ff9c930e581197 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Jun 2026 09:30:12 -0700 Subject: [PATCH 27/33] Add behavior tests pinning documented guards and semantics Seven new tests (29 total) for documented-but-untested behavior: the closed_range start/stop guard, adjacent closed ranges raising duplicate-case, exception propagation from the block body and from case actions, the default-before-case ordering quirk, non-callable case actions, and None as a legitimate result. Takes switchlang to 100% line coverage. --- tests/test_core.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index bfb5c98..0284394 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -41,6 +41,17 @@ def test_default_passthrough(self): self.assertEqual(s.result, 'default') + def test_default_before_matching_case_runs_both(self): + # documented quirk: ordering is not enforced, so a default registered + # before a matching case runs as well; this is why default belongs last + visited = [] + with switch(2) as s: + s.default(lambda: visited.append('default') or 'default') + s.case(2, lambda: visited.append(2) or 2) + + self.assertEqual(s.result, 2) + self.assertEqual(visited, ['default', 2]) + def test_none_as_valid_case(self): with switch(None) as s: s.case(1, lambda: 'one') @@ -61,6 +72,30 @@ def test_error_duplicate_case(self): s.case(1, lambda: None) s.case(1, lambda: None) + def test_error_case_action_not_callable(self): + with self.assertRaises(ValueError): + with switch(1) as s: + s.case(1, None) + + with self.assertRaises(ValueError): + with switch(1) as s: + s.case(1, 'not callable') + + def test_exception_in_block_propagates(self): + visited = [] + with self.assertRaises(RuntimeError): + with switch(1) as s: + s.case(1, lambda: visited.append(1) or 1) + raise RuntimeError('error inside the with block') + + # the error aborts the switch: no case actions run + self.assertEqual(visited, []) + + def test_exception_in_case_action_propagates(self): + with self.assertRaises(ZeroDivisionError): + with switch(1) as s: + s.case(1, lambda: 1 / 0) + def test_multiple_values_one_case_range(self): for value in range(1, 5): with switch(value) as s: @@ -124,6 +159,13 @@ def __hash__(self): self.assertIs(s.result, obj) + def test_none_as_valid_result(self): + # the sentinel must separate 'computed None' from 'computed nothing' + with switch(1) as s: + s.case(1, lambda: None) + + self.assertIsNone(s.result) + def test_closed_range(self): for value in [1, 2, 3, 4, 5]: with switch(value) as s: @@ -169,6 +211,22 @@ def test_closed_range_invalid_step(self): with self.assertRaises(ValueError): closed_range(1, 10, -2) + def test_closed_range_invalid_bounds(self): + with self.assertRaises(ValueError): + closed_range(5, 1) + + # start must be strictly less than stop: one-element ranges are rejected + with self.assertRaises(ValueError): + closed_range(3, 3) + + def test_adjacent_closed_ranges_are_duplicates(self): + # closed_range(1, 5) and closed_range(5, 9) both contain 5: unlike + # plain ranges, adjacent closed ranges overlap and are duplicate cases + with self.assertRaises(ValueError): + with switch(3) as s: + s.case(closed_range(1, 5), lambda: 'low') + s.case(closed_range(5, 9), lambda: 'high') + def test_fallthrough_simple(self): visited = [] value = 2 From a188a6e878133e3df9fc9e565f585b548d88c325 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Jun 2026 14:40:25 -0700 Subject: [PATCH 28/33] add agents files --- AGENTS.md | 1 + CLAUDE.md | 195 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ GEMINI.md | 1 + 3 files changed, 197 insertions(+) create mode 120000 AGENTS.md create mode 100644 CLAUDE.md create mode 120000 GEMINI.md diff --git a/AGENTS.md b/AGENTS.md new file mode 120000 index 0000000..681311e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1 @@ +CLAUDE.md \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..8cb64ff --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,195 @@ +# Agent guide: switchlang (python-switch) + +Guidance for AI agents working in this repository. `GEMINI.md` and `AGENTS.md` +are symlinks to this file β€” edit this one. + +## What this is + +`switchlang` adds an explicit **switch statement to Python without changing the +language**. It is implemented as a context manager: you open a `with switch(value)` +block, register cases as method calls, and read the matched case's return value +from `s.result`. The whole library is ~200 lines with **zero runtime dependencies**. + +- **Repo name** is `python-switch`; the **PyPI / import name** is `switchlang`. + Don't confuse the two β€” `import switchlang`, `pip install switchlang`. +- The package ships type hints and a `py.typed` marker (PEP 561). It is + `Typing :: Typed`. +- **The default git branch is `master`, not `main`.** Several tools (and + `great-docs.yml`) hard-code this. + +## Repository layout + +| Path | What it is | +|------|------------| +| [switchlang/__init__.py](switchlang/__init__.py) | Public package: re-exports `switch` and `closed_range`, sets `__version__`/`__author__`/`__all__`. | +| [switchlang/__switchlang_impl.py](switchlang/__switchlang_impl.py) | **The entire implementation** β€” `switch` class and `closed_range()`. Make code changes here. | +| [switchlang/py.typed](switchlang/py.typed) | PEP 561 marker so type checkers read our hints. | +| [tests/test_core.py](tests/test_core.py) | The whole test suite (29 `unittest`-style tests). | +| [pyproject.toml](pyproject.toml) | Packaging (hatchling), metadata, version, `[dev]` extra. | +| [ruff.toml](ruff.toml) | Lint + format config. | +| [great-docs.yml](great-docs.yml) | Docs site config (Great Docs / Quarto). | +| [scripts/build_docs.py](scripts/build_docs.py) | Builds docs and mirrors them into `docs/`. | +| [scripts/serve_docs.py](scripts/serve_docs.py) | Local preview that mimics the nginx subpath. | +| [docs/](docs/) | **Generated** static site (committed, served at `mkennedy.codes/docs/python-switch`). Do not hand-edit. | +| [README.md](README.md) | The narrative/marketing docs and rationale. Keep in sync with behavior. | + +Generated / ignored artifacts you should not edit or commit by hand: `docs/` +(regenerate it), `great-docs/` (ephemeral build dir, gitignored), `dist/`, +`*.egg-info/`, `venv/`. + +## The public API and its semantics + +Only two names are public (`switchlang.__all__`): **`switch`** and **`closed_range`**. + +```python +from switchlang import switch, closed_range + +with switch(value) as s: + s.case('a', process_a) # key == value -> run process_a + s.case(['v', 'b'], view_bookings) # list key: each item is a case + s.case(range(1, 6), handler) # range key: each item is a case + s.case(closed_range(1, 5), handler) # inclusive range: 1,2,3,4,5 + s.case(2, do_two, fallthrough=True) # opt into running the next case too + s.default(unknown_command) # runs if nothing else matched +print(s.result) # return value of the executed case +``` + +Behaviors that are easy to get wrong β€” preserve all of these (they are pinned by tests): + +- **Cases run on block exit, not at registration.** `case()`/`default()` only + *register*; the matched function(s) execute in `__exit__`. So `s.result` is only + valid *after* the `with` block. Reading it inside the block raises. +- **Matching is equality-based** (`key == value`). Keys are also stored in a `set`, + so case keys must be **hashable**. Any hashable value works as a key, including + `None` and arbitrary objects. +- **`default()` is just a case** keyed on a private sentinel, and **ordering is not + enforced**: a default registered *before* a matching case will also run. **Always + register `default()` last.** +- **`result` uses identity, not equality, against its "no result" sentinel.** A + computed result with a permissive `__eq__` (e.g. a NumPy array) must not be + mistaken for "nothing computed." `None` is a valid computed result and is + distinct from "not computed." +- **`case()` returns `bool`** β€” `True` if the case (or any item of a list/range + key) matched. +- **Fall-through is opt-in** per case via `fallthrough=True`; the next registered + case then runs whether or not its key matches, and so on until a case without + fall-through. When falling through, `result` is the **last** function executed. + The `fallthrough=None` value is **reserved for internal recursion** (list/range + expansion) and must not be used by callers. +- **`closed_range(start, stop, step=1)`** is inclusive on **both** ends and never + overshoots `stop`: `closed_range(1, 5)` -> `1,2,3,4,5`; `closed_range(1, 6, 2)` + -> `1,3,5`; `closed_range(1, 7, 2)` -> `1,3,5,7`. Note adjacent closed ranges + **overlap** (`closed_range(1,5)` and `closed_range(5,9)` both contain 5) and will + raise a duplicate-case error. + +Validation (all raise on registration/exit): + +- Duplicate case key -> `ValueError`. +- `func` that is `None` or not callable -> `ValueError`. +- Empty list/range key (`[]`) -> `ValueError` (it could never match). +- `closed_range` with `start >= stop` or `step < 1` -> `ValueError`. +- No case matched **and** no `default()` registered -> `Exception` on block exit. +- An **exception raised inside the `with` block** propagates and aborts the switch: + `__exit__` re-raises it before any case actions run, so for a normal exception + **no case actions run**. (One sharp edge β€” see *Implementation notes* β€” the guard + is a truthiness check, so an exception whose `__bool__` is falsy slips past it.) + +## Implementation notes (don't refactor naively) + +- The implementation lives in a deliberately **private module**, + `__switchlang_impl.py` (leading dunder); `__init__.py` re-exports `switch` and + `closed_range`. Import via the package (`from switchlang import ...`), never the + impl module directly. +- The `switch` class's `__no_result` and `__default` are **name-mangled class + attributes** assigned `uuid.uuid4()` at class-load time (mangled to + `_switch__no_result` / `_switch__default`) β€” unique, opaque sentinels. Don't + rename the class or hoist these to module level, and **keep the `result` check + identity-based** (`is`, not `==`); that identity check is what stops a result with + a permissive `__eq__` (e.g. a NumPy array) from being read as "no result." +- `__exit__` guards exception re-raise with `if exc_val:` (truthiness), not + `is not None`. For normal exceptions this is correct, but an exception whose + `__bool__`/`__len__` is falsy slips past the guard and the matched case runs + before the exception propagates. A latent sharp edge β€” switch to + `if exc_val is not None:` if you want the guarantee to be absolute. + +## Development workflow + +There is a **local, gitignored** uv-managed `venv/` β€” it is **not** in the repo, so +on a fresh checkout it is absent (and even on the maintainer's machine its symlinks may +be broken). **Never rely on `venv/bin/python` existing**; use `uv run`, which provisions +the environment on demand. Note that the tracked [.vscode/tasks.json](.vscode/tasks.json) +and [.vscode/launch.json](.vscode/launch.json) (Build / Preview Docs) hard-code +`venv/bin/python` and `venv/bin/great-docs`, so those IDE configs only work once such a +venv exists at that path β€” prefer `uv run` from the CLI. + +```bash +# Run the test suite β€” fast path, no extra deps (tests are unittest-based): +uv run python -m unittest discover -s tests + +# Or with pytest + the full dev environment (pulls in great-docs and its deps): +uv run --extra dev pytest -q + +# Lint and format (config in ruff.toml): +uvx ruff check . +uvx ruff format . +``` + +Coding constraints β€” match the existing style: + +- **Python 3.9+** is supported (classifiers go through 3.15). **Do not use syntax + that breaks 3.9.** The impl uses `from __future__ import annotations` so it can + write modern annotation syntax (`set[Any]`, `X | None`) while still importing on + 3.9. Ruff's `target-version` is pinned to `py39` to enforce this. +- Ruff config: **line length 120**, **single-quoted** strings, import sorting on + (`I`), error/pyflakes rules (`E`, `F`), McCabe max complexity **10**. +- Keep the public API fully type-hinted (the package is `py.typed`). Note **no static + type checker is wired into the project** β€” ruff only does lint/format/import-sort + (`E`/`F`/`I`). Validate hints ad hoc if you want, e.g. `uvx mypy switchlang` or + `uvx ty check switchlang`; there is no CI gate for types. +- When you change behavior, update **all three** places that document it: + the **docstrings** in `__switchlang_impl.py` (source of the API reference), + the **README**, and the **tests**. Then rebuild the docs. + +## Versioning and release + +- The version of record is `[project].version` in [pyproject.toml](pyproject.toml) + (currently `0.1.2`). `__version__` is read at runtime from installed package + metadata via `importlib.metadata`, falling back to `'0.0.0'` when not installed. + Because it reflects *installed* metadata, after a bump you must reinstall + (`uv pip install -e .`) before `__version__` or the introspected docs show the new + number. `uv.lock` is gitignored, so there is no committed lockfile. +- Build backend is **hatchling**; the wheel packages the `switchlang/` directory. +- The changelog ([docs/changelog.md](docs/changelog.md)) is generated from GitHub + Releases β€” don't hand-maintain it. + +## Documentation pipeline + +Docs are built with **Great Docs** (Quarto) and **dynamically introspect** the +installed package, so the docstrings in `__switchlang_impl.py` are the real source +of the API reference. The flow: + +1. `scripts/build_docs.py` runs `great-docs build` (output -> `great-docs/_site`, + which is ephemeral/gitignored) and **mirrors it into the committed `docs/` + folder** (full replace, so deleted pages don't linger). +2. `scripts/serve_docs.py` serves `docs/` locally on port **8099** under the + `/docs/python-switch` subpath to mirror production nginx and catch + absolute-path asset bugs. +3. Production serves the committed `docs/` at `https://mkennedy.codes/docs/python-switch/`. + +`great-docs.yml` has documented gotchas (subpath `site_url` needs a trailing +slash; SEO `canonical.base_url` must be set explicitly or the sitemap points at +the wrong domain; `mcp.enabled` is disabled; `source.branch` is `master`). The +generated site also includes agent-skill descriptors under +[docs/.well-known/](docs/.well-known/) and `llms.txt`/`llms-full.txt` β€” these are +**build output** (produced from the docstrings and `great-docs.yml`), so edit the +sources and rebuild rather than hand-editing them. + +## Quick checklist for a typical change + +1. Edit [switchlang/__switchlang_impl.py](switchlang/__switchlang_impl.py). +2. Update/extend [tests/test_core.py](tests/test_core.py) and run + `uv run python -m unittest discover -s tests`. +3. Keep docstrings + [README.md](README.md) in sync with the new behavior. +4. `uvx ruff format . && uvx ruff check .` +5. If docs-visible, rebuild: `uv run --extra dev python scripts/build_docs.py`. +6. Bump `[project].version` in [pyproject.toml](pyproject.toml) if releasing. diff --git a/GEMINI.md b/GEMINI.md new file mode 120000 index 0000000..681311e --- /dev/null +++ b/GEMINI.md @@ -0,0 +1 @@ +CLAUDE.md \ No newline at end of file From 0ea6820f2ae0074cb0dd46b0258a1390306e2628 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Jun 2026 14:46:45 -0700 Subject: [PATCH 29/33] Fix __exit__ truthiness guard so falsy exceptions still abort the switch Closes #15. --- .gitignore | 3 + CHANGELOG.md | 99 +++++++++++ CLAUDE.md | 15 +- docs/changelog.md | 14 -- docs/{changelog.html => changelog/index.html} | 161 ++++++++++++------ docs/changelog/index.md | 56 ++++++ docs/github-widget.js | 63 ++++--- docs/index.html | 10 +- docs/license.html | 34 ++-- docs/on-this-page.js | 53 ++++-- docs/reference/closed_range.html | 6 +- docs/reference/index.html | 6 +- docs/reference/switch.html | 6 +- docs/search.json | 56 +++++- ...-2de4c26ee36d61e771850f62d491bbdc.min.css} | 2 +- docs/sitemap.xml | 6 +- docs/skills.html | 6 +- great-docs.yml | 15 ++ pyproject.toml | 2 +- scripts/build_docs.py | 29 ++++ switchlang/__switchlang_impl.py | 4 +- tests/test_core.py | 16 ++ 22 files changed, 497 insertions(+), 165 deletions(-) create mode 100644 CHANGELOG.md delete mode 100644 docs/changelog.md rename docs/{changelog.html => changelog/index.html} (61%) create mode 100644 docs/changelog/index.md rename docs/site_libs/bootstrap/{bootstrap-aa1552726bdd3cb78d40c93fdbd5382a.min.css => bootstrap-2de4c26ee36d61e771850f62d491bbdc.min.css} (77%) diff --git a/.gitignore b/.gitignore index e86a975..190a5ff 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,6 @@ great-docs/ .pytest_cache/ docs/build-timings.json uv.lock + +# Great Docs "Changelog" section, staged from CHANGELOG.md by scripts/build_docs.py +/changelog/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fcea266 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,99 @@ +# Changelog + +All notable changes to **switchlang** are documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.1.2] - 2026-06-11 + +This release brings switchlang's whole public-facing surface up to date β€” a +documentation site, a shipped type-hint contract, refreshed docs β€” and fixes +two correctness bugs in the public API +([#13](https://github.com/mikeckennedy/python-switch/issues/13), +[#14](https://github.com/mikeckennedy/python-switch/issues/14)). + +### Added + +- **Type information now ships with the package.** A `py.typed` marker makes the + hints public API, so switchlang's signatures type-check and autocomplete in + IDEs and type checkers. Every public signature is annotated β€” + `case() -> bool`, `__enter__() -> switch`, `__exit__(...)`, `result -> Any`, + and `closed_range(...) -> range` β€” using modern, Python 3.9-safe syntax + (`from __future__ import annotations`). ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **Documentation site** at + [mkennedy.codes/docs/python-switch](https://mkennedy.codes/docs/python-switch/), + built with [Great Docs](https://github.com/posit-dev/great-docs) (Quarto): a + landing page plus an API reference for `switch` and `closed_range`. Includes + `scripts/build_docs.py` and `scripts/serve_docs.py`. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **`closed_range()` now validates its step.** A `step` less than 1 raises a + clear `ValueError` instead of surfacing a raw `range` error (for `step=0`) or + silently producing an empty range (for a negative step). ([#14](https://github.com/mikeckennedy/python-switch/issues/14)) +- `uv add switchlang` installation instructions alongside pip. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) + +### Changed + +- **Packaging modernized** to `pyproject.toml` + hatchling: the version is read + from package metadata, a `[dev]` extra is provided, Python 3.9–3.15 + classifiers and a `Typing :: Typed` classifier are declared, and full project + URLs (docs, repository, issues, PyPI, funding) are published. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **`case()` now always returns `bool`.** It previously returned `None` on a + scalar no-match but `False` on a list no-match; the return value is now a + consistent `bool`. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- Tooling: ruff pinned to `target-version = "py39"` to match + `requires-python = ">=3.9"`. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) + +### Fixed + +- **`closed_range(start, stop, step)` no longer overshoots `stop` when + `step > 1`.** The inclusive bound was built as `range(start, stop + step, step)`, + which added a full extra step β€” e.g. `closed_range(1, 6, 2)` yielded + `[1, 3, 5, 7]`, letting `7` (a value outside the stated range) silently match + the case. The bound is now computed as `stop + 1`, so values never pass `stop` + while `stop` is still included when a step lands on it exactly + (`closed_range(1, 7, 2)` -> `1, 3, 5, 7`). ([#14](https://github.com/mikeckennedy/python-switch/issues/14)) +- **`.result` no longer breaks for matched cases that return an always-equal + object.** The "no result" sentinel was compared with `==`, so a returned + object with a permissive `__eq__` (a NumPy array is the real-world case) made + `.result` raise *"No result has been computed"* even though a result existed. + The sentinel is now compared by identity (`is`). ([#14](https://github.com/mikeckennedy/python-switch/issues/14)) + +### Documentation + +- **README refreshed:** version and docs badges, a prominent link to the + documentation site, an honest feature list ("Validates that case actions are + callable", replacing an inaccurate signature-verification claim), a new + `s.result` bullet, a new "Fall-through and results" section, a new "Why not + just `match`?" section, a `closed_range` usage example, and f-strings + throughout. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **Docstrings rewritten to render as the API reference:** `switch` is described + as a context manager; `default()` documents that ordering is not enforced + (register it last); `case()` documents its return contract, the `ValueError`s + it raises, and the internal no-match sentinel; `result` documents that the + last function executed wins under fall-through; and `closed_range` is + documented as returning a `range` object (not a "generator") with its step + semantics and `ValueError`. ([#13](https://github.com/mikeckennedy/python-switch/issues/13)) + +## [0.1.1] - 2025-09-11 + +### Changed + +- Standardized string literals on double quotes across the codebase and added + an initial round of type annotations, including a fix for a potential type + warning on `s.result`. + +## [0.1.0] - 2020-12-10 + +### Added + +- Initial public release of switchlang on PyPI: an explicit `switch` block for + Python built on the `with` statement, with default cases, duplicate-case + detection, list/range cases, opt-in fall-through, and the `closed_range` + helper. + +[Unreleased]: https://github.com/mikeckennedy/python-switch/compare/v0.1.2...HEAD +[0.1.2]: https://github.com/mikeckennedy/python-switch/compare/v0.1.1...v0.1.2 +[0.1.1]: https://github.com/mikeckennedy/python-switch/releases/tag/v0.1.1 +[0.1.0]: https://pypi.org/project/switchlang/0.1.0/ diff --git a/CLAUDE.md b/CLAUDE.md index 8cb64ff..5f93154 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -90,9 +90,9 @@ Validation (all raise on registration/exit): - `closed_range` with `start >= stop` or `step < 1` -> `ValueError`. - No case matched **and** no `default()` registered -> `Exception` on block exit. - An **exception raised inside the `with` block** propagates and aborts the switch: - `__exit__` re-raises it before any case actions run, so for a normal exception - **no case actions run**. (One sharp edge β€” see *Implementation notes* β€” the guard - is a truthiness check, so an exception whose `__bool__` is falsy slips past it.) + `__exit__` re-raises it before any case actions run, so **no case actions run**. + This holds for any exception (the guard is `if exc_val is not None:`, so an + exception whose `__bool__` is falsy still aborts β€” see *Implementation notes*). ## Implementation notes (don't refactor naively) @@ -106,11 +106,10 @@ Validation (all raise on registration/exit): rename the class or hoist these to module level, and **keep the `result` check identity-based** (`is`, not `==`); that identity check is what stops a result with a permissive `__eq__` (e.g. a NumPy array) from being read as "no result." -- `__exit__` guards exception re-raise with `if exc_val:` (truthiness), not - `is not None`. For normal exceptions this is correct, but an exception whose - `__bool__`/`__len__` is falsy slips past the guard and the matched case runs - before the exception propagates. A latent sharp edge β€” switch to - `if exc_val is not None:` if you want the guarantee to be absolute. +- `__exit__` guards exception re-raise with `if exc_val is not None:` β€” an identity + check, **not** truthiness. This is deliberate (fixed in #15): testing + `if exc_val:` would invoke the exception's `__bool__`/`__len__`, so a falsy + exception would slip past and let the matched case run. Keep it `is not None`. ## Development workflow diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index 30f4fd5..0000000 --- a/docs/changelog.md +++ /dev/null @@ -1,14 +0,0 @@ -# Changelog - -This changelog is generated automatically from [GitHub Releases](https://github.com/mikeckennedy/python-switch/releases). - - -# v0.1.1 - -*2025-09-11* Β· [GitHub](https://github.com/mikeckennedy/python-switch/releases/tag/v0.1.1) - -Refactor codebase for consistent double‑quoted strings and add type hints - -This update replaces single‑quoted literals with double quotes throughout the repository, standardizes string formatting in `setup.py`, `__init__.py`, and test files, and introduces comprehensive type annotations to improve readability and static analysis support. The changes also clean up import statements, adjust exception messages for clarity, and ensure the package metadata uses consistent quoting conventions. πŸš€ - -Solves potential type warning on `s.result`. diff --git a/docs/changelog.html b/docs/changelog/index.html similarity index 61% rename from docs/changelog.html rename to docs/changelog/index.html index fe89236..52bc647 100644 --- a/docs/changelog.html +++ b/docs/changelog/index.html @@ -26,23 +26,23 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + - + - - + + - + - +
    @@ -161,15 +176,65 @@

    Changelog

    -

    This changelog is generated automatically from GitHub Releases.

    -
    -

    v0.1.1

    -

    2025-09-11 Β· GitHub

    -

    Refactor codebase for consistent double‑quoted strings and add type hints

    -

    This update replaces single‑quoted literals with double quotes throughout the repository, standardizes string formatting in setup.py, __init__.py, and test files, and introduces comprehensive type annotations to improve readability and static analysis support. The changes also clean up import statements, adjust exception messages for clarity, and ensure the package metadata uses consistent quoting conventions. πŸš€

    -

    Solves potential type warning on s.result.

    +

    All notable changes to switchlang are documented in this file.

    +

    The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

    +
    +

    Unreleased

    +
    +
    +

    0.1.2 - 2026-06-11

    +

    This release brings switchlang’s whole public-facing surface up to date β€” a documentation site, a shipped type-hint contract, refreshed docs β€” and fixes two correctness bugs in the public API (#13, #14).

    +
    +

    Added

    +
      +
    • Type information now ships with the package. A py.typed marker makes the hints public API, so switchlang’s signatures type-check and autocomplete in IDEs and type checkers. Every public signature is annotated β€” case() -> bool, __enter__() -> switch, __exit__(...), result -> Any, and closed_range(...) -> range β€” using modern, Python 3.9-safe syntax (from __future__ import annotations). (#13)
    • +
    • Documentation site at mkennedy.codes/docs/python-switch, built with Great Docs (Quarto): a landing page plus an API reference for switch and closed_range. Includes scripts/build_docs.py and scripts/serve_docs.py. (#13)
    • +
    • closed_range() now validates its step. A step less than 1 raises a clear ValueError instead of surfacing a raw range error (for step=0) or silently producing an empty range (for a negative step). (#14)
    • +
    • uv add switchlang installation instructions alongside pip. (#13)
    • +
    +
    +
    +

    Changed

    +
      +
    • Packaging modernized to pyproject.toml + hatchling: the version is read from package metadata, a [dev] extra is provided, Python 3.9–3.15 classifiers and a Typing :: Typed classifier are declared, and full project URLs (docs, repository, issues, PyPI, funding) are published. (#13)
    • +
    • case() now always returns bool. It previously returned None on a scalar no-match but False on a list no-match; the return value is now a consistent bool. (#13)
    • +
    • Tooling: ruff pinned to target-version = "py39" to match requires-python = ">=3.9". (#13)
    • +
    +
    +
    +

    Fixed

    +
      +
    • closed_range(start, stop, step) no longer overshoots stop when step > 1. The inclusive bound was built as range(start, stop + step, step), which added a full extra step β€” e.g. closed_range(1, 6, 2) yielded [1, 3, 5, 7], letting 7 (a value outside the stated range) silently match the case. The bound is now computed as stop + 1, so values never pass stop while stop is still included when a step lands on it exactly (closed_range(1, 7, 2) -> 1, 3, 5, 7). (#14)
    • +
    • .result no longer breaks for matched cases that return an always-equal object. The β€œno result” sentinel was compared with ==, so a returned object with a permissive __eq__ (a NumPy array is the real-world case) made .result raise β€œNo result has been computed” even though a result existed. The sentinel is now compared by identity (is). (#14)
    • +
    +
    +
    +

    Documentation

    +
      +
    • README refreshed: version and docs badges, a prominent link to the documentation site, an honest feature list (β€œValidates that case actions are callable”, replacing an inaccurate signature-verification claim), a new s.result bullet, a new β€œFall-through and results” section, a new β€œWhy not just match?” section, a closed_range usage example, and f-strings throughout. (#13)
    • +
    • Docstrings rewritten to render as the API reference: switch is described as a context manager; default() documents that ordering is not enforced (register it last); case() documents its return contract, the ValueErrors it raises, and the internal no-match sentinel; result documents that the last function executed wins under fall-through; and closed_range is documented as returning a range object (not a β€œgenerator”) with its step semantics and ValueError. (#13)
    • +
    +
    +
    +
    +

    0.1.1 - 2025-09-11

    +
    +

    Changed

    +
      +
    • Standardized string literals on double quotes across the codebase and added an initial round of type annotations, including a fix for a potential type warning on s.result.
    • +
    +
    +
    +
    +

    0.1.0 - 2020-12-10

    +
    +

    Added

    +
      +
    • Initial public release of switchlang on PyPI: an explicit switch block for Python built on the with statement, with default cases, duplicate-case detection, list/range cases, opt-in fall-through, and the closed_range helper.
    • +
    +
    @@ -519,24 +584,24 @@

    v0.1.1

    - - - + + + - - - + + + - - - - - + + + + + - + - + diff --git a/docs/changelog/index.md b/docs/changelog/index.md new file mode 100644 index 0000000..5afc0c6 --- /dev/null +++ b/docs/changelog/index.md @@ -0,0 +1,56 @@ +# Changelog + +All notable changes to **switchlang** are documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +# [Unreleased](https://github.com/mikeckennedy/python-switch/compare/v0.1.2...HEAD) + + +# [0.1.2](https://github.com/mikeckennedy/python-switch/compare/v0.1.1...v0.1.2) - 2026-06-11 + +This release brings switchlang's whole public-facing surface up to date -- a documentation site, a shipped type-hint contract, refreshed docs -- and fixes two correctness bugs in the public API ([\#13](https://github.com/mikeckennedy/python-switch/issues/13), [\#14](https://github.com/mikeckennedy/python-switch/issues/14)). + + +## Added + +- **Type information now ships with the package.** A `py.typed` marker makes the hints public API, so switchlang's signatures type-check and autocomplete in IDEs and type checkers. Every public signature is annotated -- `case() -> bool`, `__enter__() -> switch`, `__exit__(...)`, `result -> Any`, and `closed_range(...) -> range` -- using modern, Python 3.9-safe syntax (`from __future__ import annotations`). ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **Documentation site** at [mkennedy.codes/docs/python-switch](https://mkennedy.codes/docs/python-switch/), built with [Great Docs](https://github.com/posit-dev/great-docs) (Quarto): a landing page plus an API reference for [switch](../reference/switch.md#switchlang.switch) and [closed_range](../reference/closed_range.md#switchlang.closed_range). Includes `scripts/build_docs.py` and `scripts/serve_docs.py`. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **[closed_range()](../reference/closed_range.md#switchlang.closed_range) now validates its step.** A `step` less than 1 raises a clear `ValueError` instead of surfacing a raw `range` error (for `step=0`) or silently producing an empty range (for a negative step). ([\#14](https://github.com/mikeckennedy/python-switch/issues/14)) +- `uv add switchlang` installation instructions alongside pip. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) + + +## Changed + +- **Packaging modernized** to `pyproject.toml` + hatchling: the version is read from package metadata, a `[dev]` extra is provided, Python 3.9-3.15 classifiers and a `Typing :: Typed` classifier are declared, and full project URLs (docs, repository, issues, PyPI, funding) are published. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **[case()](../reference/switch.md#switchlang.switch.case) now always returns `bool`.** It previously returned `None` on a scalar no-match but `False` on a list no-match; the return value is now a consistent `bool`. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- Tooling: ruff pinned to `target-version = "py39"` to match `requires-python = ">=3.9"`. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) + + +## Fixed + +- **`closed_range(start, stop, step)` no longer overshoots `stop` when `step > 1`.** The inclusive bound was built as `range(start, stop + step, step)`, which added a full extra step -- e.g.Β `closed_range(1, 6, 2)` yielded `[1, 3, 5, 7]`, letting `7` (a value outside the stated range) silently match the case. The bound is now computed as `stop + 1`, so values never pass `stop` while `stop` is still included when a step lands on it exactly (`closed_range(1, 7, 2)` -\> `1, 3, 5, 7`). ([\#14](https://github.com/mikeckennedy/python-switch/issues/14)) +- **`.result` no longer breaks for matched cases that return an always-equal object.** The "no result" sentinel was compared with `==`, so a returned object with a permissive `__eq__` (a NumPy array is the real-world case) made `.result` raise *"No result has been computed"* even though a result existed. The sentinel is now compared by identity (`is`). ([\#14](https://github.com/mikeckennedy/python-switch/issues/14)) + + +## Documentation + +- **README refreshed:** version and docs badges, a prominent link to the documentation site, an honest feature list ("Validates that case actions are callable", replacing an inaccurate signature-verification claim), a new `s.result` bullet, a new "Fall-through and results" section, a new "Why not just `match`?" section, a [closed_range](../reference/closed_range.md#switchlang.closed_range) usage example, and f-strings throughout. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) +- **Docstrings rewritten to render as the API reference:** [switch](../reference/switch.md#switchlang.switch) is described as a context manager; [default()](../reference/switch.md#switchlang.switch.default) documents that ordering is not enforced (register it last); [case()](../reference/switch.md#switchlang.switch.case) documents its return contract, the `ValueError`s it raises, and the internal no-match sentinel; [result](../reference/switch.md#switchlang.switch.result) documents that the last function executed wins under fall-through; and [closed_range](../reference/closed_range.md#switchlang.closed_range) is documented as returning a `range` object (not a "generator") with its step semantics and `ValueError`. ([\#13](https://github.com/mikeckennedy/python-switch/issues/13)) + + +# [0.1.1](https://github.com/mikeckennedy/python-switch/releases/tag/v0.1.1) - 2025-09-11 + + +## Changed + +- Standardized string literals on double quotes across the codebase and added an initial round of type annotations, including a fix for a potential type warning on `s.result`. + + +# [0.1.0](https://pypi.org/project/switchlang/0.1.0/) - 2020-12-10 + + +## Added + +- Initial public release of switchlang on PyPI: an explicit [switch](../reference/switch.md#switchlang.switch) block for Python built on the `with` statement, with default cases, duplicate-case detection, list/range cases, opt-in fall-through, and the [closed_range](../reference/closed_range.md#switchlang.closed_range) helper. diff --git a/docs/github-widget.js b/docs/github-widget.js index 0cf1c0f..8b50776 100644 --- a/docs/github-widget.js +++ b/docs/github-widget.js @@ -15,7 +15,7 @@ owner: null, repo: null, cacheKey: 'great-docs-github-stats', - cacheDuration: 5 * 60 * 1000 // 5 minutes + cacheDuration: 4 * 60 * 60 * 1000 // 4 hours }; /** @@ -36,8 +36,17 @@ // Create the widget structure createWidgetStructure(widget); - // Fetch and display stats - fetchGitHubStats(); + // Use build-time embedded stats if available, otherwise try API + const embeddedStars = widget.dataset.stars; + const embeddedForks = widget.dataset.forks; + if (embeddedStars !== undefined && embeddedForks !== undefined) { + updateStatsDisplay({ + stars: parseInt(embeddedStars, 10), + forks: parseInt(embeddedForks, 10) + }); + } else { + fetchGitHubStats(); + } // Setup dropdown behavior setupDropdown(widget); @@ -126,11 +135,19 @@ return; } + // Get stale cache (expired but still usable as fallback) + const staleCache = getFromCache(cacheKey, true); + try { // Fetch repo stats const repoResponse = await fetch( `https://api.github.com/repos/${config.owner}/${config.repo}`, - { headers: { 'Accept': 'application/vnd.github.v3+json' } } + { + headers: { + 'Accept': 'application/vnd.github+json', + 'X-GitHub-Api-Version': '2022-11-28' + } + } ); if (!repoResponse.ok) { @@ -142,31 +159,10 @@ const stats = { stars: repoData.stargazers_count, forks: repoData.forks_count, - openIssues: repoData.open_issues_count, // This includes PRs + openIssues: repoData.open_issues_count, timestamp: Date.now() }; - // Try to get separate issue and PR counts (optional, may hit rate limits) - try { - const [issuesResponse, prsResponse] = await Promise.all([ - fetch(`https://api.github.com/search/issues?q=repo:${config.owner}/${config.repo}+type:issue+state:open`, { - headers: { 'Accept': 'application/vnd.github.v3+json' } - }), - fetch(`https://api.github.com/search/issues?q=repo:${config.owner}/${config.repo}+type:pr+state:open`, { - headers: { 'Accept': 'application/vnd.github.v3+json' } - }) - ]); - - if (issuesResponse.ok && prsResponse.ok) { - const issuesData = await issuesResponse.json(); - const prsData = await prsResponse.json(); - stats.issues = issuesData.total_count; - stats.prs = prsData.total_count; - } - } catch (e) { - // Silently fail - we'll just not show separate counts - } - // Cache the results saveToCache(cacheKey, stats); @@ -175,8 +171,12 @@ } catch (error) { console.warn('GitHub widget: Failed to fetch stats', error); - // Show fallback - updateStatsDisplay({ stars: '?', forks: '?' }); + // Use stale cache if available, otherwise show fallback + if (staleCache) { + updateStatsDisplay(staleCache); + } else { + updateStatsDisplay({ stars: '?', forks: '?' }); + } } } @@ -230,16 +230,15 @@ } /** - * Get cached data if not expired + * Get cached data if not expired (or any cached data if allowStale is true) */ - function getFromCache(key) { + function getFromCache(key, allowStale) { try { const data = localStorage.getItem(key); if (!data) return null; const parsed = JSON.parse(data); - if (Date.now() - parsed.timestamp > config.cacheDuration) { - localStorage.removeItem(key); + if (!allowStale && Date.now() - parsed.timestamp > config.cacheDuration) { return null; } return parsed; diff --git a/docs/index.html b/docs/index.html index 709bc23..51a7389 100644 --- a/docs/index.html +++ b/docs/index.html @@ -77,7 +77,7 @@ - + - - + - + - + - + - + +# Changelog is hand-maintained in the repo-root CHANGELOG.md (Keep a Changelog +# format) β€” that file is the single source of truth, NOT GitHub Releases. +# Disable Great Docs' release-driven changelog and render CHANGELOG.md instead +# via the "Changelog" section below; scripts/build_docs.py stages the file into +# changelog/index.qmd before each build. +changelog: + enabled: false + +# Custom sections. The Changelog section renders the staged CHANGELOG.md as a +# first-class page with its own navbar link (placed after the API Reference). +sections: + - title: Changelog + dir: changelog + navbar_after: Reference + # Author metadata for display in the landing page sidebar authors: - name: Michael Kennedy diff --git a/pyproject.toml b/pyproject.toml index a1ea77a..a578c00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "switchlang" -version = "0.1.2" +version = "0.1.3" description = "Adds switch blocks to the Python language." readme = "README.md" requires-python = ">=3.9" diff --git a/scripts/build_docs.py b/scripts/build_docs.py index 3d758c8..55bccbf 100644 --- a/scripts/build_docs.py +++ b/scripts/build_docs.py @@ -16,9 +16,38 @@ REPO_ROOT = Path(__file__).resolve().parent.parent # pyproject.toml + great-docs.yml live here SITE = REPO_ROOT / 'great-docs' / '_site' DEST = REPO_ROOT / 'docs' +CHANGELOG = REPO_ROOT / 'CHANGELOG.md' # hand-maintained, single source of truth +CHANGELOG_SECTION = REPO_ROOT / 'changelog' # great-docs "Changelog" section (gitignored, staged here) + + +def stage_changelog() -> None: + """Render the repo-root CHANGELOG.md into the great-docs "Changelog" section. + + Great Docs has no "source the changelog from a file" option β€” its built-in + changelog is generated from GitHub Releases (disabled in great-docs.yml). + So we treat CHANGELOG.md as the single source of truth and stage it into a + one-page section (changelog/index.qmd) on every build. The leading "# Changelog" + H1 is dropped in favor of a real page title + a version-level table of contents. + """ + if not CHANGELOG.is_file(): + print(f'CHANGELOG.md not found at {CHANGELOG}, skipping changelog section', file=sys.stderr) + return + + body = CHANGELOG.read_text(encoding='utf-8') + lines = body.splitlines() + if lines and lines[0].lstrip().startswith('# '): # drop the top-level "# Changelog" heading + lines = lines[1:] + body = '\n'.join(lines).lstrip('\n') + + front_matter = '---\ntitle: "Changelog"\ntoc: true\ntoc-depth: 2\n---\n\n' + CHANGELOG_SECTION.mkdir(parents=True, exist_ok=True) + (CHANGELOG_SECTION / 'index.qmd').write_text(front_matter + body, encoding='utf-8') + print(f'Staged CHANGELOG.md -> {CHANGELOG_SECTION / "index.qmd"}') def main() -> int: + stage_changelog() + # Prefer the great-docs entry point that lives next to this interpreter (the venv's). great_docs = Path(sys.executable).with_name('great-docs') cmd = [str(great_docs) if great_docs.exists() else 'great-docs', 'build'] diff --git a/switchlang/__switchlang_impl.py b/switchlang/__switchlang_impl.py index a94aaad..b9c5636 100644 --- a/switchlang/__switchlang_impl.py +++ b/switchlang/__switchlang_impl.py @@ -135,7 +135,9 @@ def __exit__( :raises Exception: If no case matched the value and no default case was registered. """ - if exc_val: + # Test for the presence of an exception, not its truthiness: an exception + # whose __bool__/__len__ is falsy must still abort the switch (see #15). + if exc_val is not None: raise exc_val if not self._func_stack: diff --git a/tests/test_core.py b/tests/test_core.py index 0284394..a873f1a 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -91,6 +91,22 @@ def test_exception_in_block_propagates(self): # the error aborts the switch: no case actions run self.assertEqual(visited, []) + def test_falsy_exception_in_block_still_aborts(self): + # regression for #15: __exit__ must test `exc_val is not None`, not its + # truthiness, so an exception whose __bool__ is falsy still aborts the + # switch (re-raises and runs no case actions) + class FalsyError(Exception): + def __bool__(self): + return False + + visited = [] + with self.assertRaises(FalsyError): + with switch(1) as s: + s.case(1, lambda: visited.append(1) or 1) + raise FalsyError('error inside the with block') + + self.assertEqual(visited, []) + def test_exception_in_case_action_propagates(self): with self.assertRaises(ZeroDivisionError): with switch(1) as s: From 724e0363db2234c2948edf74569a38e890fd5e7c Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Thu, 11 Jun 2026 14:55:33 -0700 Subject: [PATCH 30/33] notes for release 0.1.3 --- CHANGELOG.md | 16 +++++++++++++++- CLAUDE.md | 28 +++++++++++++++++++++------ docs/changelog/index.html | 33 ++++++++++++++++++++++---------- docs/changelog/index.md | 10 +++++++++- docs/index.html | 2 +- docs/license.html | 2 +- docs/reference/closed_range.html | 4 ++-- docs/reference/index.html | 2 +- docs/reference/switch.html | 6 +++--- docs/search.json | 11 +++++++++-- docs/skills.html | 2 +- 11 files changed, 87 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcea266..88d68fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.1.3] - 2026-06-11 + +### Fixed + +- **An exception raised inside the `with` block now always aborts the switch, + even when the exception object is falsy.** `__exit__` guarded its re-raise with + `if exc_val:`, a truthiness test that invokes the exception's `__bool__`/`__len__`. + An exception whose `__bool__` returned `False` slipped past the guard, so the + matched case action ran before the exception propagated. The guard now tests + `exc_val is not None`, restoring the documented "no case actions run on + exception" guarantee for every exception type. + ([#15](https://github.com/mikeckennedy/python-switch/issues/15)) + ## [0.1.2] - 2026-06-11 This release brings switchlang's whole public-facing surface up to date β€” a @@ -93,7 +106,8 @@ two correctness bugs in the public API detection, list/range cases, opt-in fall-through, and the `closed_range` helper. -[Unreleased]: https://github.com/mikeckennedy/python-switch/compare/v0.1.2...HEAD +[Unreleased]: https://github.com/mikeckennedy/python-switch/compare/v0.1.3...HEAD +[0.1.3]: https://github.com/mikeckennedy/python-switch/compare/v0.1.2...v0.1.3 [0.1.2]: https://github.com/mikeckennedy/python-switch/compare/v0.1.1...v0.1.2 [0.1.1]: https://github.com/mikeckennedy/python-switch/releases/tag/v0.1.1 [0.1.0]: https://pypi.org/project/switchlang/0.1.0/ diff --git a/CLAUDE.md b/CLAUDE.md index 5f93154..33ae259 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -152,14 +152,29 @@ Coding constraints β€” match the existing style: ## Versioning and release - The version of record is `[project].version` in [pyproject.toml](pyproject.toml) - (currently `0.1.2`). `__version__` is read at runtime from installed package + (currently `0.1.3`). `__version__` is read at runtime from installed package metadata via `importlib.metadata`, falling back to `'0.0.0'` when not installed. Because it reflects *installed* metadata, after a bump you must reinstall (`uv pip install -e .`) before `__version__` or the introspected docs show the new number. `uv.lock` is gitignored, so there is no committed lockfile. + - **Gotcha:** a stale `switchlang.egg-info/` in the repo root (left by an old + `setup.py`-era build) shadows the venv's `*.dist-info` on `sys.path` and makes + `importlib.metadata` report an old version no matter what you reinstall. If + `__version__` looks wrong, `rm -rf switchlang.egg-info` (it's gitignored). +- To cut a release: bump `[project].version`, rename `## [Unreleased]` in + `CHANGELOG.md` to `## [X.Y.Z] - ` (add a fresh empty `[Unreleased]` and a + new compare-link line in the footer), reinstall, then rebuild docs. The docs + **version badge** comes from PyPI (`pypi: true`), so it shows the latest + *published* release and only updates to the new version after you publish to PyPI + and rebuild β€” it legitimately lags during a release. - Build backend is **hatchling**; the wheel packages the `switchlang/` directory. -- The changelog ([docs/changelog.md](docs/changelog.md)) is generated from GitHub - Releases β€” don't hand-maintain it. +- The changelog is **hand-maintained** in the repo-root [CHANGELOG.md](CHANGELOG.md) + ([Keep a Changelog](https://keepachangelog.com/) format). Record every + user-facing change there under the `## [Unreleased]` heading; on release, rename + that heading to the new version. The docs site renders this file β€” + `scripts/build_docs.py` stages `CHANGELOG.md` into `changelog/index.qmd` before + each build (configured in `great-docs.yml`), so the generated `docs/changelog/` + output is **not** a source you edit. ## Documentation pipeline @@ -189,6 +204,7 @@ sources and rebuild rather than hand-editing them. 2. Update/extend [tests/test_core.py](tests/test_core.py) and run `uv run python -m unittest discover -s tests`. 3. Keep docstrings + [README.md](README.md) in sync with the new behavior. -4. `uvx ruff format . && uvx ruff check .` -5. If docs-visible, rebuild: `uv run --extra dev python scripts/build_docs.py`. -6. Bump `[project].version` in [pyproject.toml](pyproject.toml) if releasing. +4. Add a `## [Unreleased]` entry to [CHANGELOG.md](CHANGELOG.md) for any user-facing change. +5. `uvx ruff format . && uvx ruff check .` +6. If docs-visible, rebuild: `uv run --extra dev python scripts/build_docs.py`. +7. Bump `[project].version` in [pyproject.toml](pyproject.toml) if releasing. diff --git a/docs/changelog/index.html b/docs/changelog/index.html index 52bc647..4cf9f69 100644 --- a/docs/changelog/index.html +++ b/docs/changelog/index.html @@ -95,7 +95,7 @@